Skip to content

Commit 8d4097b

Browse files
committed
Fixing hanfling of data type REAL.
Remove extra bytes allocated by emalloc calls
1 parent e0a10ac commit 8d4097b

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

ext/mssql/php_mssql.c

+21-15
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ PHP_MINIT_FUNCTION(mssql)
305305
REGISTER_LONG_CONSTANT("SQLINT4",SQLINT4, CONST_CS | CONST_PERSISTENT);
306306
REGISTER_LONG_CONSTANT("SQLBIT",SQLBIT, CONST_CS | CONST_PERSISTENT);
307307
REGISTER_LONG_CONSTANT("SQLFLT8",SQLFLT8, CONST_CS | CONST_PERSISTENT);
308+
REGISTER_LONG_CONSTANT("SQLFLTN",SQLFLTN, CONST_CS | CONST_PERSISTENT);
308309
/* END MSSQL data types for mssql_sp_bind */
309310

310311
return SUCCESS;
@@ -373,7 +374,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
373374
case 0: /* defaults */
374375
host=user=passwd=NULL;
375376
hashed_details_length=5+3;
376-
hashed_details = (char *) emalloc(hashed_details_length+1);
377+
hashed_details = (char *) emalloc(hashed_details_length);
377378
strcpy(hashed_details,"mssql___");
378379
break;
379380
case 1: {
@@ -386,7 +387,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
386387
host = Z_STRVAL_PP(yyhost);
387388
user=passwd=NULL;
388389
hashed_details_length = Z_STRLEN_PP(yyhost)+5+3;
389-
hashed_details = (char *) emalloc(hashed_details_length+1);
390+
hashed_details = (char *) emalloc(hashed_details_length);
390391
sprintf(hashed_details,"mssql_%s__",Z_STRVAL_PP(yyhost));
391392
}
392393
break;
@@ -402,7 +403,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
402403
user = Z_STRVAL_PP(yyuser);
403404
passwd=NULL;
404405
hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+5+3;
405-
hashed_details = (char *) emalloc(hashed_details_length+1);
406+
hashed_details = (char *) emalloc(hashed_details_length);
406407
sprintf(hashed_details,"mssql_%s_%s_",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser));
407408
}
408409
break;
@@ -419,7 +420,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
419420
user = Z_STRVAL_PP(yyuser);
420421
passwd = Z_STRVAL_PP(yypasswd);
421422
hashed_details_length = Z_STRLEN_PP(yyhost)+Z_STRLEN_PP(yyuser)+Z_STRLEN_PP(yypasswd)+5+3;
422-
hashed_details = (char *) emalloc(hashed_details_length+1);
423+
hashed_details = (char *) emalloc(hashed_details_length);
423424
sprintf(hashed_details,"mssql_%s_%s_%s",Z_STRVAL_PP(yyhost),Z_STRVAL_PP(yyuser),Z_STRVAL_PP(yypasswd)); /* SAFE */
424425
}
425426
break;
@@ -442,7 +443,7 @@ static void php_mssql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
442443
dbprocerrhandle(mssql.login, (DBERRHANDLE_PROC) php_mssql_error_handler);
443444
dbprocmsghandle(mssql.login, (DBMSGHANDLE_PROC) php_mssql_message_handler);
444445

445-
if (MS_SQL_G(secure_connection)){
446+
if (MS_SQL_G(secure_connection) == 1){
446447
DBSETLSECURE(mssql.login);
447448
}
448449
else {
@@ -778,19 +779,22 @@ static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int off
778779
Z_TYPE_P(result) = IS_STRING;
779780
break;
780781
}
781-
case SQLFLT8: {
782-
Z_DVAL_P(result) = (double) floatcol(offset);
782+
case SQLFLT4:
783+
Z_DVAL_P(result) = (double) floatcol4(offset);
784+
Z_TYPE_P(result) = IS_DOUBLE;
785+
break;
786+
case SQLFLT8:
787+
Z_DVAL_P(result) = (double) floatcol8(offset);
783788
Z_TYPE_P(result) = IS_DOUBLE;
784789
break;
785-
}
786790
case SQLVARBINARY:
787791
case SQLBINARY:
788792
case SQLIMAGE: {
789793
DBBINARY *bin;
790794
unsigned char *res_buf;
791795
int res_length = dbdatlen(mssql_ptr->link, offset);
792796

793-
res_buf = (unsigned char *) emalloc(res_length + 1);
797+
res_buf = (unsigned char *) emalloc(res_length);
794798
bin = ((DBBINARY *)dbdata(mssql_ptr->link, offset));
795799
memcpy(res_buf,bin,res_length);
796800
res_buf[res_length] = '\0';
@@ -811,13 +815,13 @@ static void php_mssql_get_column_content_with_type(mssql_link *mssql_ptr,int off
811815
if (column_type == SQLDATETIM4) res_length += 14;
812816
if (column_type == SQLDATETIME) res_length += 10;
813817

814-
res_buf = (unsigned char *) emalloc(res_length + 1);
818+
res_buf = (unsigned char *) emalloc(res_length);
815819
res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1);
816820
} else {
817821
dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset));
818822

819823
res_length = 19;
820-
res_buf = (unsigned char *) emalloc(res_length + 1);
824+
res_buf = (unsigned char *) emalloc(res_length);
821825
sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second);
822826
}
823827

@@ -846,7 +850,7 @@ static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int
846850
unsigned char *res_buf;
847851
int res_length = dbdatlen(mssql_ptr->link, offset);
848852

849-
res_buf = (unsigned char *) emalloc(res_length + 1);
853+
res_buf = (unsigned char *) emalloc(res_length);
850854
bin = ((DBBINARY *)dbdata(mssql_ptr->link, offset));
851855
memcpy(res_buf, bin, res_length);
852856
res_buf[res_length] = '\0';
@@ -864,14 +868,14 @@ static void php_mssql_get_column_content_without_type(mssql_link *mssql_ptr,int
864868
if (column_type == SQLDATETIM4) res_length += 14;
865869
if (column_type == SQLDATETIME) res_length += 10;
866870

867-
res_buf = (unsigned char *) emalloc(res_length + 1);
868-
res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR,res_buf,-1);
871+
res_buf = (unsigned char *) emalloc(res_length);
872+
res_length = dbconvert(NULL,coltype(offset),dbdata(mssql_ptr->link,offset), res_length, SQLCHAR, res_buf, -1);
869873

870874
} else {
871875
dbdatecrack(mssql_ptr->link, &dateinfo, (DBDATETIME *) dbdata(mssql_ptr->link,offset));
872876

873877
res_length = 19;
874-
res_buf = (unsigned char *) emalloc(res_length + 1);
878+
res_buf = (unsigned char *) emalloc(res_length);
875879
sprintf(res_buf, "%d-%02d-%02d %02d:%02d:%02d" , dateinfo.year, dateinfo.month, dateinfo.day, dateinfo.hour, dateinfo.minute, dateinfo.second);
876880
}
877881

@@ -1881,6 +1885,7 @@ PHP_FUNCTION(mssql_bind)
18811885
switch (type) {
18821886

18831887
case SQLFLT8:
1888+
case SQLFLTN:
18841889
convert_to_double_ex(var);
18851890
value=(LPBYTE)(&Z_DVAL_PP(var));
18861891
break;
@@ -2024,6 +2029,7 @@ PHP_FUNCTION(mssql_execute)
20242029
break;
20252030

20262031
case SQLFLT8:
2032+
case SQLFLTN:
20272033
convert_to_double_ex(&bind->zval);
20282034
Z_DVAL_P(bind->zval)=*((double *)(dbretdata(mssql_ptr->link,i)));
20292035
break;

ext/mssql/php_mssql.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
#define tinyintcol(i) ((int) *(DBTINYINT *) dbdata(mssql_ptr->link,i))
4242
#define anyintcol(j) (coltype(j)==SQLINT4?intcol(j):(coltype(j)==SQLINT2?smallintcol(j):tinyintcol(j)))
4343
#define charcol(i) ((DBCHAR *) dbdata(mssql_ptr->link,i))
44-
#define floatcol(i) ((float) *(DBFLT8 *) dbdata(mssql_ptr->link,i))
44+
#define floatcol4(i) ((float) *(DBFLT4 *) dbdata(mssql_ptr->link,i))
45+
#define floatcol8(i) ((float) *(DBFLT8 *) dbdata(mssql_ptr->link,i))
4546

4647
#ifdef ZTS
4748
#include "TSRM.h"

0 commit comments

Comments
 (0)