The DBD code assumes long == int in SQL_INTEGER parameter handling. Does anybody know what is right, or if it matters? I can't work it out from 10 minutes of googling. GCC 12.1 is warning for the current code which is clearly heap corruption for 64-bit builds:
dbd/apr_dbd_odbc.c: In function 'odbc_bind_param': dbd/apr_dbd_odbc.c:572:17: warning: array subscript 'long int[0]' is partly outside array bounds of 'unsigned char[4]' [-Warray-bounds] 572 | *(long *)ptr = | ^~~~~~~~~~~~ e.g. this would fix it: Index: dbd/apr_dbd_odbc.c =================================================================== --- dbd/apr_dbd_odbc.c (revision 1903480) +++ dbd/apr_dbd_odbc.c (working copy) @@ -569,8 +569,8 @@ case SQL_INTEGER: ptr = apr_palloc(pool, sizeof(int)); len = sizeof(int); - *(long *)ptr = - (textmode ? atol(args[*argp]) : *(long *)args[*argp]); + *(int *)ptr = + (textmode ? atoi(args[*argp]) : *(int *)args[*argp]); break; case SQL_FLOAT: ptr = apr_palloc(pool, sizeof(float));