drawkcaB | Backward Compatible logo

rants and tips about software

64bit PHP 5.2 and Firebird blobs

There’s a bug introduced between PHP 5.2.1 and 5.2.2 that affects handling of Firebird blobs on 64bit machines. Having moved some of my servers to 64bit Slackware (Slamd64 to be more precise) I run into this problem.

Unless you want to recompile the whole PHP to a newer version with the fix (5.3 as I understand, although did not test), you can patch the sources: Just open ibase_blobs.c file and modify this function:

_php_ibase_quad_to_string

char *result = (char *) emalloc(BLOB_ID_LEN+1);
/* shortcut for most common case */
if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
  sprintf(result, "0x%0*" LL_MASK "x", 16, *(ISC_UINT64*)(void *) &qd);
} else {
  ISC_UINT64 res = ((ISC_UINT64) qd.gds_quad_high;
  sprintf(result, "0x%0*" LL_MASK "x", 16, res);
}
result[BLOB_ID_LEN] = '\0';
return result;

Rebuild the interbase.so, copy to extension directory, restart Apache and you’re done.

Milan Babuškov, 2010-03-20
Copyright © Milan Babu┼íkov 2006-2014