Date: Friday, November 10, 2006 @ 14:24:33
  Author: csaba
    Path: /cvsroot/carob/libmysequoia

Modified: src/Utils.cpp (1.43 -> 1.44) test/TestMySQLAPI.cpp (1.45 ->
          1.46) test/TestMySQLAPI.hpp (1.21 -> 1.22)

Do not use sprintf, use snprintf instead! Fixes for LMS-31


-----------------------+
 src/Utils.cpp         |    2 -
 test/TestMySQLAPI.cpp |   55 ++++++++++++++++++++++++++++++++++++++++++++++++
 test/TestMySQLAPI.hpp |    2 +
 3 files changed, 58 insertions(+), 1 deletion(-)


Index: libmysequoia/src/Utils.cpp
diff -u libmysequoia/src/Utils.cpp:1.43 libmysequoia/src/Utils.cpp:1.44
--- libmysequoia/src/Utils.cpp:1.43     Fri Oct 20 20:40:52 2006
+++ libmysequoia/src/Utils.cpp  Fri Nov 10 14:24:33 2006
@@ -697,7 +697,7 @@
       int len;
       if (field->decimals >= 31)
       {
-        len = sprintf((char *)bind->buffer, "%-*.*g", 
(int)bind->buffer_length, (int)min(14, FLT_DIG), f);
+        len = snprintf((char *)bind->buffer, bind->buffer_length, "%-*.*g", 
(int)bind->buffer_length, (int)min(14, FLT_DIG), f);
         if (len > 0 && (unsigned)len <= bind->buffer_length)
         {
           char *c = strchr((char *)bind->buffer, ' ');
Index: libmysequoia/test/TestMySQLAPI.cpp
diff -u libmysequoia/test/TestMySQLAPI.cpp:1.45 
libmysequoia/test/TestMySQLAPI.cpp:1.46
--- libmysequoia/test/TestMySQLAPI.cpp:1.45     Fri Nov  3 14:52:30 2006
+++ libmysequoia/test/TestMySQLAPI.cpp  Fri Nov 10 14:24:33 2006
@@ -1162,3 +1162,58 @@
   // free the result set
   mysql_free_result(res);
 }
+
+void TestMySQLAPI::bug_lms_31_test(void)
+{
+  MYSQL_STMT *stmt;
+  MYSQL_RES *stmt_metadata;
+  MYSQL_BIND outbind[2];
+  MYSQL_FIELD *stmt_field_list;
+  long stmt_field_count;
+  my_bool is_true = true;
+  int i;
+  char *query = "select * from t1";
+
+  CPPUNIT_ASSERT(mysql_real_connect(mysql, HOST, USER1, PASSWD1, DB1, 0, 0, 0) 
!= 0);
+  mysql_query(mysql, "drop table t1");
+  CPPUNIT_ASSERT(mysql_query(mysql, "create table t1 (i int, f float)") == 0);
+  CPPUNIT_ASSERT(mysql_query(mysql, "insert into t1 values (0, 0.0),(1, 
1.1),(2, 2.2)") == 0);
+
+  CPPUNIT_ASSERT((stmt = mysql_stmt_init(mysql)) != 0);
+  CPPUNIT_ASSERT(mysql_stmt_prepare(stmt, query, strlen(query)) == 0);
+  CPPUNIT_ASSERT(mysql_stmt_execute(stmt) == 0);
+  
+  CPPUNIT_ASSERT(mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, 
&is_true) == 0);
+  CPPUNIT_ASSERT(mysql_stmt_store_result(stmt) == 0);
+
+  CPPUNIT_ASSERT(stmt_metadata = mysql_stmt_result_metadata(stmt));
+  CPPUNIT_ASSERT(stmt_field_list = mysql_fetch_fields(stmt_metadata));
+  CPPUNIT_ASSERT(stmt_field_count = mysql_num_fields(stmt_metadata));
+
+  memset(outbind, 0, sizeof(outbind));
+  for (i= 0; i < stmt_field_count; ++i)
+  {
+    outbind[i].buffer_type= MYSQL_TYPE_STRING;
+    outbind[i].buffer_length= stmt_field_list[i].max_length + 1;
+    outbind[i].buffer= malloc(outbind[i].buffer_length);
+  }
+  CPPUNIT_ASSERT(mysql_stmt_bind_result(stmt, outbind) == 0);
+
+  CPPUNIT_ASSERT(mysql_stmt_fetch(stmt) == 0);
+  CPPUNIT_ASSERT(memcmp(outbind[0].buffer, "0", 2) == 0);
+  CPPUNIT_ASSERT(memcmp(outbind[1].buffer, "0", 2) == 0);
+  CPPUNIT_ASSERT(mysql_stmt_fetch(stmt) == 0);
+  CPPUNIT_ASSERT(memcmp(outbind[0].buffer, "1", 2) == 0);
+  CPPUNIT_ASSERT(memcmp(outbind[1].buffer, "1.1", 4) == 0);
+  CPPUNIT_ASSERT(mysql_stmt_fetch(stmt) == 0);
+  CPPUNIT_ASSERT(memcmp(outbind[0].buffer, "2", 2) == 0);
+  CPPUNIT_ASSERT(memcmp(outbind[1].buffer, "2.2", 4) == 0);
+
+  for (i= 0; i < stmt_field_count; ++i)
+    free(outbind[i].buffer);
+
+  CPPUNIT_ASSERT(mysql_stmt_close(stmt) == 0); 
+
+  // free the result set
+  mysql_free_result(stmt_metadata);
+}
Index: libmysequoia/test/TestMySQLAPI.hpp
diff -u libmysequoia/test/TestMySQLAPI.hpp:1.21 
libmysequoia/test/TestMySQLAPI.hpp:1.22
--- libmysequoia/test/TestMySQLAPI.hpp:1.21     Fri Nov  3 14:52:30 2006
+++ libmysequoia/test/TestMySQLAPI.hpp  Fri Nov 10 14:24:33 2006
@@ -68,6 +68,7 @@
     CPPUNIT_TEST (bug_lms_27_test);
     CPPUNIT_TEST (bug_lms_28_test);
     CPPUNIT_TEST (bug_lms_29_test);
+    CPPUNIT_TEST (bug_lms_31_test);
   CPPUNIT_TEST_SUITE_END ();
 
 public:
@@ -113,6 +114,7 @@
   void bug_lms_27_test(void);
   void bug_lms_28_test(void);
   void bug_lms_29_test(void);
+  void bug_lms_31_test(void);
 private:
   MYSQL *mysql;
 };

_______________________________________________
Carob-commits mailing list
[email protected]
https://forge.continuent.org/mailman/listinfo/carob-commits

Reply via email to