The Samba-Bugzilla – Attachment 1143 Details for
Bug 2555
Samba hangs with postgres backend
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Correct SQL usage in various ways
sql.patch (text/plain), 13.76 KB, created by
Fernando Schapachnik
on 2005-04-07 06:23:57 UTC
(
hide
)
Description:
Correct SQL usage in various ways
Filename:
MIME Type:
Creator:
Fernando Schapachnik
Created:
2005-04-07 06:23:57 UTC
Size:
13.76 KB
patch
obsolete
>--- passdb/pdb_pgsql.c.orig 2005-03-11 10:47:04.000000000 -0300 >+++ passdb/pdb_pgsql.c 2005-04-07 09:16:00.000000000 -0300 >@@ -32,6 +32,11 @@ > PGconn *handle ; > PGresult *pwent ; > long currow ; >+ const char *db ; >+ const char *host ; >+ const char *port ; >+ const char *user ; >+ const char *pass ; > > const char *location ; > } pdb_pgsql_data ; >@@ -42,10 +47,6 @@ > return NT_STATUS_INVALID_PARAMETER; \ > } \ > data = (struct pdb_pgsql_data *)methods->private_data; \ >- if(!data || !(data->handle)){ \ >- DEBUG(0, ("invalid handle!\n")); \ >- return NT_STATUS_INVALID_HANDLE; \ >- } \ > } > > #define SET_DATA_QUIET(data,methods) { \ >@@ -53,17 +54,51 @@ > DEBUG(0, ("invalid methods!\n")); \ > return ; \ > } \ >- data = (struct pdb_pgsql_data *)methods->private_data; \ >- if(!data || !(data->handle)){ \ >- DEBUG(0, ("invalid handle!\n")); \ >- return ; \ >- } \ >+ data = (struct pdb_pgsql_data *)methods->private_data;\ > } > >- > #define config_value( data, name, default_value ) \ > lp_parm_const_string( GLOBAL_SECTION_SNUM, (data)->location, name, default_value ) > >+static PGconn *pgsqlsam_connect ( struct pdb_pgsql_data *data ) >+{ >+ PGconn *handle; >+ >+ DEBUG >+ ( >+ 1, >+ ( >+ "Connecting to database server, host: %s, user: %s, password: XXXXXX, database: %s, port: %s\n", >+ data->host, data->user, data->db, data->port >+ ) >+ ) ; >+ >+ /* Do the pgsql initialization */ >+ handle = PQsetdbLogin( >+ data->host, >+ data->port, >+ NULL, >+ NULL, >+ data->db, >+ data->user, >+ data->pass >+ ) ; >+ >+ if ( handle != NULL && PQstatus( handle ) != CONNECTION_OK ) >+ { >+ DEBUG( 0, ("Failed to connect to pgsql database: error: %s\n", >+ (handle != NULL ? PQerrorMessage( handle ) : "")) ) ; >+ return NULL; >+ } >+ >+ DEBUG( 5, ("Connected to pgsql database\n") ) ; >+ return handle; >+} >+ >+#define END_CONNECTION( data ) \ >+ if ( (data)->pwent != NULL) PQclear( (data)->pwent ); \ >+ PQfinish( (data)->handle ); >+ > static long PQgetlong( PGresult *r, long row, long col ) > { > if ( PQgetisnull( r, row, col ) ) return 0 ; >@@ -130,6 +165,12 @@ > NTSTATUS retval ; > > SET_DATA( data, methods ) ; >+ >+ /* Connect to the DB. */ >+ data->handle = pgsqlsam_connect ( data ); >+ if ( data->handle == NULL ) >+ return NT_STATUS_UNSUCCESSFUL ; >+ DEBUG( 5, ("CONNECTING pgsqlsam_setsampwent\n") ) ; > > query = sql_account_query_select(data->location, update, SQL_SEARCH_NONE, NULL); > >@@ -154,6 +195,9 @@ > DEBUG( 5, ("pgsqlsam_setsampwent succeeded(%d results)!\n", PQntuples(data->pwent)) ) ; > retval = NT_STATUS_OK ; > } >+ >+ END_CONNECTION( data ); >+ DEBUG( 5, ("DISCONNECTING pgsqlsam_setsampwent\n") ) ; > > SAFE_FREE(query); > return retval ; >@@ -233,6 +277,12 @@ > > //tmp_sname = smb_xstrdup(sname); > PQescapeString( esc, sname, strlen(sname) ) ; >+ >+ /* Connect to the DB. */ >+ data->handle = pgsqlsam_connect ( data ); >+ if ( data->handle == NULL ) >+ return NT_STATUS_UNSUCCESSFUL ; >+ DEBUG( 5, ("CONNECTING pgsqlsam_select_by_field\n") ) ; > > query = sql_account_query_select(data->location, True, field, esc); > >@@ -258,8 +308,11 @@ > > SAFE_FREE( esc ) ; > SAFE_FREE( query ) ; >- >- PQclear( result ) ; >+ >+ if ( result != NULL ) >+ PQclear( result ) ; >+ END_CONNECTION( data ); >+ DEBUG( 5, ("DISCONNECTING pgsqlsam_select_by_field\n") ) ; > > return retval ; > } >@@ -271,6 +324,9 @@ > static NTSTATUS pgsqlsam_getsampwnam ( struct pdb_methods *methods, SAM_ACCOUNT *user, const char *sname ) > { > struct pdb_pgsql_data *data; >+ size_t i, l; >+ char *lowercasename; >+ NTSTATUS result; > > SET_DATA(data, methods); > >@@ -279,8 +335,18 @@ > DEBUG( 0, ("invalid name specified") ) ; > return NT_STATUS_INVALID_PARAMETER; > } >+ >+ lowercasename = smb_xstrdup(sname); >+ l = strlen(lowercasename); >+ for(i = 0; i < l; i++) { >+ lowercasename[i] = tolower(lowercasename[i]); >+ } > >- return pgsqlsam_select_by_field( methods, user, SQL_SEARCH_USER_NAME, sname ) ; >+ result = pgsqlsam_select_by_field( methods, user, SQL_SEARCH_USER_NAME, lowercasename ) ; >+ >+ SAFE_FREE( lowercasename ) ; >+ >+ return result; > } > > >@@ -332,6 +398,12 @@ > } > > PQescapeString( esc, sname, strlen(sname) ) ; >+ >+ /* Connect to the DB. */ >+ data->handle = pgsqlsam_connect ( data ); >+ if ( data->handle == NULL ) >+ return NT_STATUS_UNSUCCESSFUL ; >+ DEBUG( 5, ("CONNECTING pgsqlsam_delete_sam_account\n") ) ; > > query = sql_account_query_delete(data->location, esc); > >@@ -354,8 +426,12 @@ > retval = NT_STATUS_OK ; > } > >+ if ( result != NULL ) >+ PQclear( result ) ; > SAFE_FREE( esc ) ; > SAFE_FREE( query ) ; >+ END_CONNECTION( data ) ; >+ DEBUG( 5, ("DISCONNECTING pgsqlsam_delete_sam_account\n") ) ; > > return retval ; > } >@@ -365,6 +441,7 @@ > struct pdb_pgsql_data *data ; > char *query; > PGresult *result ; >+ NTSTATUS retval ; > > if ( !methods ) > { >@@ -381,24 +458,39 @@ > } > > query = sql_account_query_update(data->location, newpwd, isupdate); >+ if ( query == NULL ) /* Nothing to update. */ >+ return NT_STATUS_OK; > >- result = PQexec( data->handle, query ) ; >+ /* Connect to the DB. */ >+ data->handle = pgsqlsam_connect ( data ); >+ if ( data->handle == NULL ) >+ return NT_STATUS_UNSUCCESSFUL ; >+ DEBUG( 5, ("CONNECTING pgsqlsam_replace_sam_account\n") ) ; > >+ result = PQexec( data->handle, query ) ; > > /* Execute the query */ > if ( result == NULL ) > { > DEBUG( 0, ("Error executing %s, %s\n", query, PQerrorMessage( data->handle ) ) ) ; >- return NT_STATUS_INVALID_PARAMETER; >+ retval = NT_STATUS_INVALID_PARAMETER; > } > else if ( PQresultStatus( result ) != PGRES_COMMAND_OK ) > { > DEBUG( 0, ("Error executing %s, %s\n", query, PQresultErrorMessage( result ) ) ) ; >- return NT_STATUS_INVALID_PARAMETER; >+ retval = NT_STATUS_INVALID_PARAMETER; >+ } >+ else >+ { >+ retval = NT_STATUS_OK; > } >+ if ( result != NULL ) >+ PQclear( result ) ; > SAFE_FREE(query); >+ END_CONNECTION( data ); >+ DEBUG( 5, ("DISCONNECTING pgsqlsam_replace_sam_account\n") ) ; > >- return NT_STATUS_OK; >+ return retval; > } > > static NTSTATUS pgsqlsam_add_sam_account ( struct pdb_methods *methods, SAM_ACCOUNT *newpwd ) >@@ -466,25 +558,15 @@ > config_value( data, "pgsql port" , CONFIG_PORT_DEFAULT ) > ) > ) ; >+ >+ /* Save the parameters. */ >+ data->db = config_value( data, "pgsql database", CONFIG_DB_DEFAULT ); >+ data->host = config_value( data, "pgsql host" , CONFIG_HOST_DEFAULT ); >+ data->port = config_value( data, "pgsql port" , CONFIG_PORT_DEFAULT ); >+ data->user = config_value( data, "pgsql user" , CONFIG_USER_DEFAULT ); >+ data->pass = config_value( data, "pgsql password", CONFIG_PASS_DEFAULT ); > >- /* Do the pgsql initialization */ >- data->handle = PQsetdbLogin( >- config_value( data, "pgsql host" , CONFIG_HOST_DEFAULT ), >- config_value( data, "pgsql port" , CONFIG_PORT_DEFAULT ), >- NULL, >- NULL, >- config_value( data, "pgsql database", CONFIG_DB_DEFAULT ), >- config_value( data, "pgsql user" , CONFIG_USER_DEFAULT ), >- config_value( data, "pgsql password", CONFIG_PASS_DEFAULT ) >- ) ; >- >- if ( PQstatus( data->handle ) != CONNECTION_OK ) >- { >- DEBUG( 0, ("Failed to connect to pgsql database: error: %s\n", PQerrorMessage( data->handle )) ) ; >- return NT_STATUS_UNSUCCESSFUL; >- } >- >- DEBUG( 5, ("Connected to pgsql database\n") ) ; >+ DEBUG( 5, ("Pgsql module intialized\n") ) ; > return NT_STATUS_OK; > } > >--- passdb/pdb_sql.c.orig 2005-03-11 10:47:04.000000000 -0300 >+++ passdb/pdb_sql.c 2005-04-07 09:14:44.000000000 -0300 >@@ -295,6 +295,7 @@ > pstring temp; > pdb_sql_query query; > fstring sid_str; >+ int some_field_affected = 0; > > query.update = isupdate; > >@@ -316,6 +317,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_ACCTCTRL)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, "acct ctrl column", > CONFIG_ACCT_CTRL_DEFAULT), >@@ -323,6 +325,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_LOGONTIME)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "logon time column", >@@ -331,6 +334,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_LOGOFFTIME)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "logoff time column", >@@ -339,6 +343,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_KICKOFFTIME)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "kickoff time column", >@@ -347,6 +352,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_CANCHANGETIME)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "pass can change time column", >@@ -355,6 +361,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_MUSTCHANGETIME)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "pass must change time column", >@@ -363,6 +370,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_PASSLASTSET)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "pass last set time column", >@@ -371,6 +379,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_HOURSLEN)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "hours len column", >@@ -379,6 +388,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_LOGONDIVS)) { >+ some_field_affected = 1; > pdb_sql_int_field(&query, > config_value_write(location, > "logon divs column", >@@ -387,6 +397,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_USERSID)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "user sid column", > CONFIG_USER_SID_DEFAULT), >@@ -395,6 +406,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_GROUPSID)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "group sid column", > CONFIG_GROUP_SID_DEFAULT), >@@ -403,6 +415,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_USERNAME)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "username column", > CONFIG_USERNAME_DEFAULT), >@@ -410,6 +423,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_DOMAIN)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "domain column", > CONFIG_DOMAIN_DEFAULT), >@@ -417,6 +431,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_USERNAME)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, > "nt username column", >@@ -425,6 +440,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_FULLNAME)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "fullname column", > CONFIG_FULLNAME_DEFAULT), >@@ -432,6 +448,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_LOGONSCRIPT)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, > "logon script column", >@@ -440,6 +457,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_PROFILE)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, > "profile path column", >@@ -448,6 +466,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_DRIVE)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "dir drive column", > CONFIG_DIR_DRIVE_DEFAULT), >@@ -455,6 +474,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_SMBHOME)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, "home dir column", > CONFIG_HOME_DIR_DEFAULT), >@@ -462,6 +482,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_WORKSTATIONS)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, > "workstations column", >@@ -470,6 +491,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_UNKNOWNSTR)) { >+ some_field_affected = 1; > pdb_sql_string_field(&query, > config_value_write(location, > "unknown string column", >@@ -478,6 +500,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_LMPASSWD)) { >+ some_field_affected = 1; > pdb_sethexpwd(temp, pdb_get_lanman_passwd(newpwd), > pdb_get_acct_ctrl(newpwd)); > pdb_sql_string_field(&query, >@@ -487,6 +510,7 @@ > } > > if (IS_SAM_CHANGED(newpwd, PDB_NTPASSWD)) { >+ some_field_affected = 1; > pdb_sethexpwd(temp, pdb_get_nt_passwd(newpwd), > pdb_get_acct_ctrl(newpwd)); > pdb_sql_string_field(&query, >@@ -494,6 +518,11 @@ > CONFIG_NT_PW_DEFAULT), temp); > } > >+ if (!some_field_affected) { >+ talloc_destroy(query.mem_ctx); >+ return NULL; >+ } >+ > if (query.update) { > query.part1[strlen(query.part1) - 1] = '\0'; > query.part1 = >@@ -503,7 +532,7 @@ > "user sid column", > CONFIG_USER_SID_DEFAULT), > sid_to_string(sid_str, pdb_get_user_sid (newpwd))); >- } else { >+ } else { > query.part2[strlen(query.part2) - 1] = ')'; > query.part1[strlen(query.part1) - 1] = ')'; > query.part1 = >--- passdb/pdb_mysql.c.orig 2005-02-25 14:59:36.000000000 -0300 >+++ passdb/pdb_mysql.c 2005-04-07 09:14:44.000000000 -0300 >@@ -382,6 +382,8 @@ > } > > query = sql_account_query_update(data->location, newpwd, isupdate); >+ if ( query == NULL ) /* Nothing to update. */ >+ return NT_STATUS_OK; > > /* Execute the query */ > if (mysql_query(data->handle, query)) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 2555
:
1143
|
1153