@@ -2212,11 +2212,12 @@ PHP_FUNCTION(chunk_split)
2212
2212
2213
2213
/* {{{ proto string substr(string str, int start [, int length])
2214
2214
Returns part of a string */
2215
+ /* XXX This function has to be revised when a better php integer type was integrated */
2215
2216
PHP_FUNCTION (substr )
2216
2217
{
2217
2218
char * str ;
2218
2219
long l = 0 , f ;
2219
- zend_str_size str_len ;
2220
+ zend_str_size_int str_len ;
2220
2221
int argc = ZEND_NUM_ARGS ();
2221
2222
2222
2223
if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "Sl|l" , & str , & str_len , & f , & l ) == FAILURE ) {
@@ -2226,28 +2227,28 @@ PHP_FUNCTION(substr)
2226
2227
if (argc > 2 ) {
2227
2228
if ((l < 0 && - l > str_len )) {
2228
2229
RETURN_FALSE ;
2229
- } else if (l >= 0 && l > str_len ) {
2230
+ } else if (l > ( long ) str_len ) {
2230
2231
l = str_len ;
2231
2232
}
2232
2233
} else {
2233
2234
l = str_len ;
2234
2235
}
2235
2236
2236
- if (f > 0 && f > str_len ) {
2237
+ if (f > ( long ) str_len ) {
2237
2238
RETURN_FALSE ;
2238
2239
} else if (f < 0 && - f > str_len ) {
2239
2240
f = 0 ;
2240
2241
}
2241
2242
2242
- if (l < 0 && (( f > 0 && ( l + str_len ) < f ) || ( f < 0 && ( l + str_len ) > - f )) ) {
2243
+ if (l < 0 && (l + ( long ) str_len - f ) < 0 ) {
2243
2244
RETURN_FALSE ;
2244
2245
}
2245
2246
2246
2247
/* if "from" position is negative, count start position from the end
2247
2248
* of the string
2248
2249
*/
2249
2250
if (f < 0 ) {
2250
- f = str_len + f ;
2251
+ f = ( long ) str_len + f ;
2251
2252
if (f < 0 ) {
2252
2253
f = 0 ;
2253
2254
}
@@ -2257,17 +2258,17 @@ PHP_FUNCTION(substr)
2257
2258
* needed to stop that many chars from the end of the string
2258
2259
*/
2259
2260
if (l < 0 ) {
2260
- l = (str_len - f ) + l ;
2261
+ l = (( long ) str_len - f ) + l ;
2261
2262
if (l < 0 ) {
2262
2263
l = 0 ;
2263
2264
}
2264
2265
}
2265
2266
2266
- if (f >= str_len ) {
2267
+ if (f >= ( long ) str_len ) {
2267
2268
RETURN_FALSE ;
2268
2269
}
2269
2270
2270
- if ((f + l ) > str_len ) {
2271
+ if ((f + l ) > ( long ) str_len ) {
2271
2272
l = str_len - f ;
2272
2273
}
2273
2274
0 commit comments