More static fstring elimination.
[samba.git] / source / services / services_db.c
index 430c58f50da6f6791740bb9e9b81ee438f28f2fc..c57b29cc806f3eacc2872baae7709a351a681b5e 100644 (file)
@@ -125,22 +125,22 @@ static SEC_DESC* construct_service_sd( TALLOC_CTX *ctx )
 
 static char *get_common_service_dispname( const char *servicename )
 {
-       static fstring dispname;
        int i;
 
        for ( i=0; common_unix_svcs[i].servicename; i++ ) {
                if (strequal(servicename, common_unix_svcs[i].servicename)) {
-                       fstr_sprintf( dispname, "%s (%s)",
+                       char *dispname;
+                       if (asprintf(&dispname,
+                               "%s (%s)",
                                common_unix_svcs[i].dispname,
-                               common_unix_svcs[i].servicename );
-
+                               common_unix_svcs[i].servicename) < 0) {
+                               return NULL;
+                       }
                        return dispname;
                }
        }
 
-       fstrcpy( dispname, servicename );
-
-       return dispname;
+       return SMB_STRDUP(servicename );
 }
 
 /********************************************************************
@@ -292,6 +292,7 @@ static void fill_service_values( const char *name, REGVAL_CTR *values )
 
        if ( builtin_svcs[i].servicename == NULL ) {
                char *pstr = NULL;
+               char *dispname = NULL;
                struct rcinit_file_information *init_info = NULL;
 
                if (asprintf(&pstr, "%s/%s/%s",get_dyn_LIBDIR(),
@@ -303,7 +304,9 @@ static void fill_service_values( const char *name, REGVAL_CTR *values )
                }
 
                /* lookup common unix display names */
-               init_unistr2( &dname, get_common_service_dispname( name ), UNI_STR_TERMINATE );
+               dispname = get_common_service_dispname(name);
+               init_unistr2( &dname, dispname ? dispname : "", UNI_STR_TERMINATE );
+               SAFE_FREE(dispname);
 
                /* get info from init file itself */
                if ( read_init_file( name, &init_info ) ) {
@@ -602,9 +605,9 @@ bool svcctl_set_secdesc( TALLOC_CTX *ctx, const char *name, SEC_DESC *sec_desc,
 /********************************************************************
 ********************************************************************/
 
-char *svcctl_lookup_dispname( const char *name, NT_USER_TOKEN *token )
+const char *svcctl_lookup_dispname(TALLOC_CTX *ctx, const char *name, NT_USER_TOKEN *token )
 {
-       static fstring display_name;
+       char *display_name = NULL;
        REGISTRY_KEY *key = NULL;
        REGVAL_CTR *values;
        REGISTRY_VALUE *val;
@@ -637,7 +640,7 @@ char *svcctl_lookup_dispname( const char *name, NT_USER_TOKEN *token )
        if ( !(val = regval_ctr_getvalue( values, "DisplayName" )) )
                goto fail;
 
-       rpcstr_pull( display_name, regval_data_p(val), sizeof(display_name), regval_size(val), 0 );
+       rpcstr_pull_talloc(ctx, &display_name, regval_data_p(val), regval_size(val), 0 );
 
        TALLOC_FREE( key );
 
@@ -646,16 +649,15 @@ char *svcctl_lookup_dispname( const char *name, NT_USER_TOKEN *token )
 fail:
        /* default to returning the service name */
        TALLOC_FREE( key );
-       fstrcpy( display_name, name );
-       return display_name;
+       return talloc_strdup(ctx, name);
 }
 
 /********************************************************************
 ********************************************************************/
 
-char *svcctl_lookup_description( const char *name, NT_USER_TOKEN *token )
+const char *svcctl_lookup_description(TALLOC_CTX *ctx, const char *name, NT_USER_TOKEN *token )
 {
-       static fstring description;
+       char *description = NULL;
        REGISTRY_KEY *key = NULL;
        REGVAL_CTR *values;
        REGISTRY_VALUE *val;
@@ -670,7 +672,7 @@ char *svcctl_lookup_description( const char *name, NT_USER_TOKEN *token )
        wresult = regkey_open_internal( NULL, &key, path, token,
                                        REG_KEY_READ );
        if ( !W_ERROR_IS_OK(wresult) ) {
-               DEBUG(0,("svcctl_lookup_dispname: key lookup failed! [%s] (%s)\n", 
+               DEBUG(0,("svcctl_lookup_description: key lookup failed! [%s] (%s)\n", 
                        path, dos_errstr(wresult)));
                SAFE_FREE(path);
                return NULL;
@@ -678,19 +680,19 @@ char *svcctl_lookup_description( const char *name, NT_USER_TOKEN *token )
        SAFE_FREE(path);
 
        if ( !(values = TALLOC_ZERO_P( key, REGVAL_CTR )) ) {
-               DEBUG(0,("svcctl_lookup_dispname: talloc() failed!\n"));
+               DEBUG(0,("svcctl_lookup_description: talloc() failed!\n"));
                TALLOC_FREE( key );
                return NULL;
        }
 
        fetch_reg_values( key, values );
 
-       if ( !(val = regval_ctr_getvalue( values, "Description" )) )
-               fstrcpy( description, "Unix Service");
-       else
-               rpcstr_pull( description, regval_data_p(val), sizeof(description), regval_size(val), 0 );
-
-       TALLOC_FREE( key );
+       if ( !(val = regval_ctr_getvalue( values, "Description" )) ) {
+               TALLOC_FREE( key );
+               return "Unix Service";
+       }
+       rpcstr_pull_talloc(ctx, &description, regval_data_p(val), regval_size(val), 0 );
+       TALLOC_FREE(key);
 
        return description;
 }