Free memory on error
authorAlan T. DeKok <aland@freeradius.org>
Sat, 2 Mar 2013 15:07:15 +0000 (10:07 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 2 Mar 2013 15:12:42 +0000 (10:12 -0500)
src/modules/rlm_sql/drivers/rlm_sql_oracle/rlm_sql_oracle.c

index 1338a25..9693332 100644 (file)
@@ -358,7 +358,7 @@ static int sql_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t *config,
                if (x != OCI_SUCCESS) {
                        radlog(L_ERR,"rlm_sql_oracle: OCIParamGet() failed in sql_select_query: %s",
                                sql_error(handle, config));
-                       return -1;
+                       goto error;
                }
 
                x=OCIAttrGet((dvoid*)param, OCI_DTYPE_PARAM,
@@ -367,7 +367,7 @@ static int sql_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t *config,
                if (x != OCI_SUCCESS) {
                        radlog(L_ERR,"rlm_sql_oracle: OCIAttrGet() failed in sql_select_query: %s",
                                sql_error(handle, config));
-                       return -1;
+                       goto error;
                }
 
                dsize=MAX_DATASTR_LEN;
@@ -393,7 +393,7 @@ static int sql_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t *config,
                        if (x != OCI_SUCCESS) {
                                radlog(L_ERR,"rlm_sql_oracle: OCIAttrGet() failed in sql_select_query: %s",
                                        sql_error(handle, config));
-                               return -1;
+                               goto error;
                        }
                        rowdata[y-1]=rad_malloc(dsize+1);
                        memset(rowdata[y-1], 0, dsize+1);
@@ -427,13 +427,10 @@ static int sql_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t *config,
                                (dvoid *) 0,
                                OCI_DEFAULT);
 
-               /*
-                *      FIXME: memory leaks of indicators & rowdata?
-                */
                if (x != OCI_SUCCESS) {
                        radlog(L_ERR,"rlm_sql_oracle: OCIDefineByPos() failed in sql_select_query: %s",
                                sql_error(handle, config));
-                       return -1;
+                       goto error;
                }
        }
 
@@ -441,6 +438,16 @@ static int sql_select_query(rlm_sql_handle_t *handle, rlm_sql_config_t *config,
        oracle_sock->indicators=indicators;
 
        return 0;
+
+ error:
+       for (y=0; y < colcount; y++) {
+               free(rowdata[y]);
+       }
+
+       free(rowdata);
+       free(indicators);
+
+       return -1;
 }