Skip to content

Commit cb0a577

Browse files
committed
Cap negative XSQLVAR lengths (#87)
1 parent 6313db4 commit cb0a577

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

ibase_query.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
#define FETCH_ROW 1
5151
#define FETCH_ARRAY 2
5252

53+
// Appearantly XSQLVAR len fields can come in > 31 and < 0 depending on
54+
// fbclient-server combination
55+
#define CAP_XSQLVAR_LEN(len, str) ((len) > 31 || (len) < 0 ? MIN(31, strlen((str))) : (len))
56+
5357
typedef struct {
5458
unsigned short vary_length;
5559
char vary_string[1];
@@ -1915,14 +1919,14 @@ static void _php_ibase_field_info(zval *return_value, ibase_query *ib_query, int
19151919
} else {
19161920
#endif
19171921
// Old API
1918-
add_index_stringl(return_value, 0, var->sqlname, MIN(31, var->sqlname_length));
1919-
add_assoc_stringl(return_value, "name", var->sqlname, MIN(31, var->sqlname_length));
1922+
add_index_stringl(return_value, 0, var->sqlname, CAP_XSQLVAR_LEN(var->sqlname_length, var->sqlname));
1923+
add_assoc_stringl(return_value, "name", var->sqlname, CAP_XSQLVAR_LEN(var->sqlname_length, var->sqlname));
19201924

1921-
add_index_stringl(return_value, 1, var->aliasname, MIN(31, var->aliasname_length));
1922-
add_assoc_stringl(return_value, "alias", var->aliasname, MIN(31, var->aliasname_length));
1925+
add_index_stringl(return_value, 1, var->aliasname, CAP_XSQLVAR_LEN(var->aliasname_length, var->aliasname));
1926+
add_assoc_stringl(return_value, "alias", var->aliasname, CAP_XSQLVAR_LEN(var->aliasname_length, var->aliasname));
19231927

1924-
add_index_stringl(return_value, 2, var->relname, MIN(31, var->relname_length));
1925-
add_assoc_stringl(return_value, "relation", var->relname, MIN(31, var->relname_length));
1928+
add_index_stringl(return_value, 2, var->relname, CAP_XSQLVAR_LEN(var->relname_length, var->relname));
1929+
add_assoc_stringl(return_value, "relation", var->relname, CAP_XSQLVAR_LEN(var->relname_length, var->relname));
19261930
#if FB_API_VER >= 40
19271931
}
19281932
#endif
@@ -2215,7 +2219,7 @@ static int _php_ibase_alloc_ht_aliases(ibase_query *ib_query)
22152219
XSQLVAR *var = &ib_query->out_sqlda->sqlvar[i];
22162220

22172221
_php_ibase_insert_alias(ib_query->ht_aliases,
2218-
var->aliasname, MIN(31, var->aliasname_length));
2222+
var->aliasname, CAP_XSQLVAR_LEN(var->aliasname_length, var->aliasname));
22192223
}
22202224
#if FB_API_VER >= 40
22212225
}

0 commit comments

Comments
 (0)