Update of /cvsroot/pywin32/pywin32/com/win32com/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16297/win32com/src
Modified Files:
oleargs.cpp univgw_dataconv.cpp
Log Message:
Fix some errors when attempting to use integer values > sys.maxint - both
when the VT is unknown, and when the VT is explicitly VT_UI4.
Also catch int conversion errors in the universal gateway.
Index: univgw_dataconv.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/univgw_dataconv.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** univgw_dataconv.cpp 27 Jun 2005 11:02:41 -0000 1.9
--- univgw_dataconv.cpp 13 Feb 2006 01:23:48 -0000 1.10
***************
*** 392,395 ****
--- 392,397 ----
}
*pi = PyInt_AsLong(obUse);
+ if (*pi == (UINT)-1 && PyErr_Occurred())
+ goto Error;
break;
}
***************
*** 397,406 ****
{
UINT *pui = *(UINT **)pbArg;
! obUse = PyNumber_Int(obOutValue);
! if (obUse == NULL)
! {
! goto Error;
}
! *pui = (UINT)PyInt_AsLong(obUse);
break;
}
--- 399,419 ----
{
UINT *pui = *(UINT **)pbArg;
! // special care here as we could be > sys.maxint,
! // in which case we must work with longs.
! // Avoiding PyInt_AsUnsignedLongMask as it doesn't
! // exist in 2.2.
! if (PyLong_Check(obOutValue)) {
! *pui = PyLong_AsUnsignedLong(obOutValue);
! } else {
! // just do the generic "number" thing.
! obUse = PyNumber_Int(obOutValue);
! if (obUse == NULL)
! {
! goto Error;
! }
! *pui = (UINT)PyInt_AsLong(obUse);
}
! if (*pui == (UINT)-1 && PyErr_Occurred())
! goto Error;
break;
}
***************
*** 414,417 ****
--- 427,432 ----
}
*ps = (short)PyInt_AsLong(obUse);
+ if (*ps == (UINT)-1 && PyErr_Occurred())
+ goto Error;
break;
}
***************
*** 425,428 ****
--- 440,445 ----
}
*pus = (unsigned short)PyInt_AsLong(obUse);
+ if (*pus == (UINT)-1 && PyErr_Occurred())
+ goto Error;
break;
}
***************
*** 436,439 ****
--- 453,458 ----
}
*pb = (signed char)PyInt_AsLong(obUse);
+ if (*pb == (UINT)-1 && PyErr_Occurred())
+ goto Error;
break;
}
***************
*** 462,465 ****
--- 481,486 ----
}
*pb = (BYTE)PyInt_AsLong(obUse);
+ if (*pb == (UINT)-1 && PyErr_Occurred())
+ goto Error;
}
break;
***************
*** 474,477 ****
--- 495,500 ----
}
*pbool = PyInt_AsLong(obUse) ? VARIANT_TRUE : VARIANT_FALSE;
+ if (*pbool == (UINT)-1 && PyErr_Occurred())
+ goto Error;
break;
}
Index: oleargs.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/oleargs.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -C2 -d -r1.33 -r1.34
*** oleargs.cpp 5 Feb 2006 07:27:43 -0000 1.33
--- oleargs.cpp 13 Feb 2006 01:23:48 -0000 1.34
***************
*** 72,77 ****
if ((double)dwval == dval)
{
! V_VT(var) = VT_I4;
! V_I4(var) = dwval;
isDword = TRUE;
}
--- 72,77 ----
if ((double)dwval == dval)
{
! V_VT(var) = VT_UI4;
! V_UI4(var) = dwval;
isDword = TRUE;
}
***************
*** 259,263 ****
break;
}
! result = PyInt_FromLong(V_UI4(&varValue));
break;
--- 259,268 ----
break;
}
! // The result may be too large for a simple "long". If so,
! // we must return a long.
! if (V_UI4(&varValue) <= LONG_MAX)
! result = PyInt_FromLong(V_UI4(&varValue));
! else
! result = PyLong_FromUnsignedLong(V_UI4(&varValue));
break;
|