From 7566495e5aeeafdd063a324b483793e8d4e443c4 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Fri, 29 Oct 2010 14:34:18 +0200 Subject: [PATCH] Convert uuid_bin2string to not allocate but return pointer to static string --- bin/misc/uuidtest.c | 8 ++--- etc/afpd/auth.c | 7 ++-- include/atalk/uuid.h | 2 +- libatalk/acl/aclldap.h | 16 +-------- libatalk/acl/cache.c | 10 ++---- libatalk/acl/ldap.c | 21 +++++++++--- libatalk/acl/ldap_config.c | 1 + libatalk/acl/uuid.c | 67 +++++++++++++++----------------------- 8 files changed, 53 insertions(+), 79 deletions(-) diff --git a/bin/misc/uuidtest.c b/bin/misc/uuidtest.c index a52670a4..4385a3ee 100644 --- a/bin/misc/uuidtest.c +++ b/bin/misc/uuidtest.c @@ -91,9 +91,7 @@ int main( int argc, char **argv) printf("Searching user: %s\n", optarg); ret = getuuidfromname( optarg, UUID_USER, uuid); if (ret == 0) { - uuid_bin2string( uuid, &uuidstring); - printf("User: %s ==> UUID: %s\n", optarg, uuidstring); - free(uuidstring); + printf("User: %s ==> UUID: %s\n", optarg, uuid_bin2string(uuid)); } else { printf("User %s not found.\n", optarg); } @@ -106,9 +104,7 @@ int main( int argc, char **argv) printf("Searching group: %s\n", optarg); ret = getuuidfromname( optarg, UUID_GROUP, uuid); if (ret == 0) { - uuid_bin2string( uuid, &uuidstring); - printf("Group: %s ==> UUID: %s\n", optarg, uuidstring); - free(uuidstring); + printf("Group: %s ==> UUID: %s\n", optarg, uuid_bin2string(uuid)); } else { printf("Group %s not found.\n", optarg); } diff --git a/etc/afpd/auth.c b/etc/afpd/auth.c index 0737c07f..5cfa47c1 100644 --- a/etc/afpd/auth.c +++ b/etc/afpd/auth.c @@ -1009,16 +1009,13 @@ int afp_getuserinfo(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, #ifdef HAVE_ACLS int ret; atalk_uuid_t uuid; - char *uuidstring; ret = getuuidfromname( obj->username, UUID_USER, uuid); if (ret != 0) { LOG(log_info, logtype_afpd, "afp_getuserinfo: error getting UUID !"); return AFPERR_NOITEM; } - if (0 == (uuid_bin2string( uuid, &uuidstring))) { - LOG(log_debug, logtype_afpd, "afp_getuserinfo: got UUID: %s", uuidstring); - free(uuidstring); - } + LOG(log_debug, logtype_afpd, "afp_getuserinfo: got UUID: %s", uuid_bin2string(uuid)); + memcpy(rbuf, uuid, UUID_BINSIZE); rbuf += UUID_BINSIZE; *rbuflen += UUID_BINSIZE; diff --git a/include/atalk/uuid.h b/include/atalk/uuid.h index f5449606..729a41fb 100644 --- a/include/atalk/uuid.h +++ b/include/atalk/uuid.h @@ -42,7 +42,7 @@ extern char *ldap_uid_attr; extern int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid); extern int getnamefromuuid( const uuidp_t uuidp, char **name, uuidtype_t *type); -extern int uuid_bin2string( uuidp_t uuidp, char **uuidstring); +extern const char *uuid_bin2string( char *uuid); extern void uuid_string2bin( const char *uuidstring, uuidp_t uuid); #endif /* AFP_UUID_H */ diff --git a/libatalk/acl/aclldap.h b/libatalk/acl/aclldap.h index 085ed0b4..b4adea9f 100644 --- a/libatalk/acl/aclldap.h +++ b/libatalk/acl/aclldap.h @@ -1,5 +1,4 @@ /* - $Id: aclldap.h,v 1.1 2009-02-02 11:55:01 franklahm Exp $ Copyright (c) 2008,2009 Frank Lahm This program is free software; you can redistribute it and/or modify @@ -22,20 +21,7 @@ * Interface ********************************************************/ -/* - * name: give me his name - * type: and type of USER or GROUP - * uuid_string: returns pointer to allocated string - * returns 0 on success !=0 on errror - */ extern int ldap_getuuidfromname( const char *name, uuidtype_t type, char **uuid_string); - -/* - * uuipd: give me his uuid - * name: returns pointer to allocated string - * type: returns type: USER or GROUP - * returns 0 on success !=0 on errror - */ -extern int ldap_getnamefromuuid( uuidp_t uuidp, char **name, uuidtype_t *type); +extern int ldap_getnamefromuuid( const char *uuidstr, char **name, uuidtype_t *type); #endif /* ACLLDAP_H */ diff --git a/libatalk/acl/cache.c b/libatalk/acl/cache.c index 519113eb..1d7314cc 100644 --- a/libatalk/acl/cache.c +++ b/libatalk/acl/cache.c @@ -49,22 +49,19 @@ static int dumpcache() { int i; int ret = 0; cacheduser_t *entry; - char *uuidstring = NULL; char timestr[200]; struct tm *tmp = NULL; for ( i=0 ; i<256; i++) { if ((entry = namecache[i]) != NULL) { do { - uuid_bin2string(entry->uuid, &uuidstring); tmp = localtime(&entry->creationtime); if (tmp == NULL) continue; if (strftime(timestr, 200, "%c", tmp) == 0) continue; LOG(log_debug9, logtype_default, "namecache{%d}: name:%s, uuid:%s, type: %s, cached: %s", - i, entry->name, uuidstring, uuidtype[entry->type], timestr); - free(uuidstring); + i, entry->name, uuid_bin2string(entry->uuid), uuidtype[entry->type], timestr); } while ((entry = entry->next) != NULL); } } @@ -72,15 +69,14 @@ static int dumpcache() { for ( i=0; i<256; i++) { if ((entry = uuidcache[i]) != NULL) { do { - uuid_bin2string(entry->uuid, &uuidstring); + tmp = localtime(&entry->creationtime); if (tmp == NULL) continue; if (strftime(timestr, 200, "%c", tmp) == 0) continue; LOG(log_debug9, logtype_default, "uuidcache{%d}: uuid:%s, name:%s, type: %s, cached: %s", - i, uuidstring, entry->name, uuidtype[entry->type], timestr); - free(uuidstring); + i, uuid_bin2string(entry->uuid), entry->name, uuidtype[entry->type], timestr); } while ((entry = entry->next) != NULL); } } diff --git a/libatalk/acl/ldap.c b/libatalk/acl/ldap.c index d177ea6b..5fc277b8 100644 --- a/libatalk/acl/ldap.c +++ b/libatalk/acl/ldap.c @@ -247,9 +247,16 @@ cleanup: * Interface ********************************************************/ -/* - * returns allocated storage in uuid_string, caller must free it - * returns 0 on success, -1 on error or not found +/*! + * Search UUID for name in LDAP + * + * Caller must free uuid_string when done with it + * + * @param name (r) name to search + * @param type (r) type of USER or GROUP + * @param uuid_string (w) result as pointer to allocated UUID-string + * + * @returns 0 on success, -1 on error or not found */ int ldap_getuuidfromname( const char *name, uuidtype_t type, char **uuid_string) { int ret; @@ -283,8 +290,14 @@ int ldap_getuuidfromname( const char *name, uuidtype_t type, char **uuid_string) * LDAP search wrapper * returns allocated storage in name, caller must free it * returns 0 on success, -1 on error or not found + * + * @param uuidstr (r) uuid to search as ascii string + * @param name (w) return pointer to name as allocated string + * @param type (w) return type: USER or GROUP + * + * returns 0 on success, -1 on errror */ -int ldap_getnamefromuuid( char *uuidstr, char **name, uuidtype_t *type) { +int ldap_getnamefromuuid( const char *uuidstr, char **name, uuidtype_t *type) { int ret; int len; char filter[256]; /* this should really be enough. we dont want to malloc everything! */ diff --git a/libatalk/acl/ldap_config.c b/libatalk/acl/ldap_config.c index b7c160c1..9bac9f3b 100644 --- a/libatalk/acl/ldap_config.c +++ b/libatalk/acl/ldap_config.c @@ -20,6 +20,7 @@ #ifdef HAVE_ACLS #include +#include #include #include #include diff --git a/libatalk/acl/uuid.c b/libatalk/acl/uuid.c index 126669cc..010de4db 100644 --- a/libatalk/acl/uuid.c +++ b/libatalk/acl/uuid.c @@ -69,24 +69,18 @@ void uuid_string2bin( const char *uuidstring, uuidp_t uuid) { } -/* - * convert 16 byte binary uuid to neat ascii represantation including dashes - * string is allocated and pointer returned. caller must freee. +/*! + * Convert 16 byte binary uuid to neat ascii represantation including dashes. + * + * Returns pointer to static buffer. */ -int uuid_bin2string( uuidp_t uuid, char **uuidstring) { +const char *uuid_bin2string(char *uuid) { + static char uuidstring[UUID_STRINGSIZE + 1]; char ascii[16] = { "0123456789ABCDEF" }; int nibble = 1; int i = 0; - unsigned char c; - char *s; - - *uuidstring = calloc(1, UUID_STRINGSIZE + 1); - if (*uuidstring == NULL) { - LOG(log_error, logtype_default, "uuid_bin2string: %s: error calloc'ing",strerror(errno)); - return -1; - } - s = *uuidstring; - + int c; + while (i < UUID_STRINGSIZE) { c = *uuid; if (nibble) @@ -95,13 +89,14 @@ int uuid_bin2string( uuidp_t uuid, char **uuidstring) { c &= 0x0f; uuid++; } - s[i] = ascii[c]; + uuidstring[i] = ascii[c]; nibble ^= 1; i++; if (i==8 || i==13 || i==18 || i==23) - s[i++] = '-'; + uuidstring[i++] = '-'; } - return 0; + uuidstring[i] = 0; + return uuidstring; } /******************************************************** @@ -119,16 +114,12 @@ int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) { char *uuid_string = NULL; ret = search_cachebyname( name, type, uuid); - if (ret == 0) { /* found in cache */ -#ifdef DEBUG - uuid_bin2string( uuid, &uuid_string); + if (ret == 0) { + /* found in cache */ LOG(log_debug, logtype_afpd, "getuuidfromname{cache}: name: %s, type: %s -> UUID: %s", - name, uuidtype[type], uuid_string); -#else - LOG(log_debug, logtype_afpd, "getuuidfromname{cache}: name: %s, type: %s", - name, uuidtype[type]); -#endif - } else { /* if not found in cache */ + name, uuidtype[type], uuid_bin2string(uuid)); + } else { + /* if not found in cache */ ret = ldap_getuuidfromname( name, type, &uuid_string); if (ret != 0) { LOG(log_note, logtype_afpd, "getuuidfromname(\"%s\",t:%u): no result from ldap search", @@ -141,7 +132,7 @@ int getuuidfromname( const char *name, uuidtype_t type, uuidp_t uuid) { } cleanup: - free(uuid_string); + if (uuid_string) free(uuid_string); return ret; } @@ -163,18 +154,14 @@ static char local_user_uuid[] = {0xff, 0xff, 0xee, 0xee, 0xdd, 0xdd, */ int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) { int ret; - char *uuid_string = NULL; ret = search_cachebyuuid( uuidp, name, type); - if (ret == 0) { /* found in cache */ -#ifdef DEBUG - uuid_bin2string( uuidp, &uuid_string); + if (ret == 0) { + /* found in cache */ LOG(log_debug9, logtype_afpd, "getnamefromuuid{cache}: UUID: %s -> name: %s, type:%s", - uuid_string, *name, uuidtype[*type]); - free(uuid_string); - uuid_string = NULL; -#endif - } else { /* if not found in cache */ + uuid_bin2string(uuidp), *name, uuidtype[*type]); + } else { + /* not found in cache */ /* Check if UUID is a client local one */ if (memcmp(uuidp, local_user_uuid, 12) == 0 @@ -186,19 +173,17 @@ int getnamefromuuid(const uuidp_t uuidp, char **name, uuidtype_t *type) { return 0; } - uuid_bin2string( uuidp, &uuid_string); - ret = ldap_getnamefromuuid( uuid_string, name, type); + ret = ldap_getnamefromuuid(uuid_bin2string(uuidp), name, type); if (ret != 0) { LOG(log_warning, logtype_afpd, "getnamefromuuid(%s): no result from ldap_getnamefromuuid", - uuid_string); + uuid_bin2string(uuidp)); goto cleanup; } add_cachebyuuid( uuidp, *name, *type, 0); LOG(log_debug, logtype_afpd, "getnamefromuuid{LDAP}: UUID: %s -> name: %s, type:%s", - uuid_string, *name, uuidtype[*type]); + uuid_bin2string(uuidp), *name, uuidtype[*type]); } cleanup: - free(uuid_string); return ret; } -- 2.39.2