Notice allocation failures in database fetch.
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Tue, 8 Jun 2010 17:50:03 +0000 (17:50 +0000)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Tue, 8 Jun 2010 17:50:03 +0000 (17:50 +0000)
org.glite.lbjp-common.db/src/db-mysql.c
org.glite.lbjp-common.db/src/db-pg.c

index 3b525f6..ecec644 100644 (file)
@@ -1007,14 +1007,24 @@ static int FetchRowSimple(glite_lbu_DBContextMysql ctx, MYSQL_RES *result, unsig
        for (i=0; i<nr; i++) {
                if (lengths) lengths[i] = len[i];
                if (len[i]) {
-                       results[i] = malloc(len[i] + 1);
+                       if ((results[i] = malloc(len[i] + 1)) == NULL)
+                               goto nomem;
                        memcpy(results[i], row[i], len[i]);
                        results[i][len[i]] = '\000';
-               } else
-                       results[i] = strdup("");
+               } else {
+                       if ((results[i] = strdup("")) == NULL)
+                               goto nomem;
+               }
        }
 
        return nr;
+nomem:
+       for (nr = i, i = 0; i < nr; i++) {
+               free(results[i]);
+               results[i] = NULL;
+       }
+       ERR(ctx, ENOMEM, "insufficient memory for field data");
+       return -1;
 }
 
 
@@ -1042,7 +1052,10 @@ static int FetchRowPrepared(glite_lbu_DBContextMysql ctx, glite_lbu_StatementMys
                binds[i].buffer_type = MYSQL_TYPE_VAR_STRING;
                binds[i].buffer_length = GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH - 1;
                binds[i].length = &lengths[i];
-               binds[i].buffer = results[i] = calloc(1, GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH);
+               if ((binds[i].buffer = results[i] = calloc(1, GLITE_LBU_DEFAULT_RESULT_BUFFER_LENGTH)) == NULL) {
+                       ERR(ctx, ENOMEM, "insufficient memory for field data");
+                       goto failed;
+               }
        }
        if (mysql_module.mysql_stmt_bind_result(stmt->stmt, binds) != 0) goto failedstmt;
 
index c0acfc6..1581ac8 100644 (file)
@@ -348,12 +348,20 @@ int glite_lbu_FetchRowPsql(glite_lbu_Statement stmt_gen, unsigned int maxn, unsi
        for (i = 0; i < n; i++) {
                /* sanity check for internal error (NULL when invalid row) */
                s = psql_module.PQgetvalue(stmt->res, stmt->row, i) ? : "";
-               results[i] = strdup(s);
+               if ((results[i] = strdup(s)) == NULL)
+                       goto nomem;
                if (lengths) lengths[i] = strlen(s);
        }
 
        stmt->row++;
        return n;
+nomem:
+       for (n = i, i = 0; i < n; i++) {
+               free(results[i]);
+               results[i] = NULL;
+       }
+       set_error(stmt->generic.ctx, ENOMEM, "insufficient memory for field data");
+       return -1;
 }