From beec1ea8291c9c2b12745d37ffe307dd4e3bd6ec Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 20 Mar 2001 23:07:36 +0000 Subject: Fix for crash when doing name lookup with a quoted string. Part of lookup_name was expecting to be able to write to the string. Changed lookup_name to use const. Jeremy. (This used to be commit 80c18d88491f1148ade623e81c33f84ba4f952f3) --- source3/include/dlinklist.h | 18 ++++++++++++------ source3/include/proto.h | 6 +++--- source3/nsswitch/wb_client.c | 2 +- source3/passdb/passdb.c | 12 +++++++++++- source3/smbd/uid.c | 3 +-- 5 files changed, 28 insertions(+), 13 deletions(-) (limited to 'source3') diff --git a/source3/include/dlinklist.h b/source3/include/dlinklist.h index d510aad028..c35155d9bc 100644 --- a/source3/include/dlinklist.h +++ b/source3/include/dlinklist.h @@ -37,17 +37,17 @@ }\ } - -/* remove an element from a list */ +/* remove an element from a list - element doesn't have to be in list. */ #define DLIST_REMOVE(list, p) \ { \ if ((p) == (list)) { \ (list) = (p)->next; \ if (list) (list)->prev = NULL; \ } else { \ - (p)->prev->next = (p)->next; \ + if ((p)->prev) (p)->prev->next = (p)->next; \ if ((p)->next) (p)->next->prev = (p)->prev; \ } \ + (p)->next = (p)->prev = NULL; \ } /* promote an element to the top of the list */ @@ -57,10 +57,9 @@ DLIST_ADD(list, p) \ } -/* demote an element to the top of the list, needs a tmp pointer */ -#define DLIST_DEMOTE(list, p, tmp) \ +/* hook into the end of the list - needs a tmp pointer */ +#define DLIST_ADD_END(list, p, tmp) \ { \ - DLIST_REMOVE(list, p) \ if (!(list)) { \ (list) = (p); \ (p)->next = (p)->prev = NULL; \ @@ -71,3 +70,10 @@ (p)->prev = (tmp); \ } \ } + +/* demote an element to the top of the list, needs a tmp pointer */ +#define DLIST_DEMOTE(list, p, tmp) \ +{ \ + DLIST_REMOVE(list, p) \ + DLIST_ADD_END(list, p, tmp) \ +} diff --git a/source3/include/proto.h b/source3/include/proto.h index 7e158c1e03..c53ad6971a 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -1502,7 +1502,7 @@ void expire_workgroups_and_servers(time_t t); /*The following definitions come from nsswitch/wb_client.c */ -BOOL winbind_lookup_name(char *name, DOM_SID *sid, enum SID_NAME_USE *name_type); +BOOL winbind_lookup_name(const char *name, DOM_SID *sid, enum SID_NAME_USE *name_type); BOOL winbind_lookup_sid(DOM_SID *sid, fstring dom_name, fstring name, enum SID_NAME_USE *name_type); BOOL winbind_sid_to_uid(uid_t *puid, DOM_SID *sid); BOOL winbind_uid_to_sid(DOM_SID *sid, uid_t uid); @@ -1841,7 +1841,7 @@ uint32 pdb_uid_to_user_rid(uid_t uid); uint32 pdb_gid_to_group_rid(gid_t gid); BOOL pdb_rid_is_user(uint32 rid); BOOL local_lookup_rid(uint32 rid, char *name, enum SID_NAME_USE *psid_name_use); -BOOL local_lookup_name(char *domain, char *user, DOM_SID *psid, enum SID_NAME_USE *psid_name_use); +BOOL local_lookup_name(const char *c_domain, const char *c_user, DOM_SID *psid, enum SID_NAME_USE *psid_name_use); DOM_SID *local_uid_to_sid(DOM_SID *psid, uid_t uid); BOOL local_sid_to_uid(uid_t *puid, DOM_SID *psid, enum SID_NAME_USE *name_type); DOM_SID *local_gid_to_sid(DOM_SID *psid, gid_t gid); @@ -4167,7 +4167,7 @@ BOOL become_authenticated_pipe_user(pipes_struct *p); BOOL unbecome_authenticated_pipe_user(pipes_struct *p); void become_root(void); void unbecome_root(void); -BOOL lookup_name(char *name, DOM_SID *psid, enum SID_NAME_USE *name_type); +BOOL lookup_name(const char *name, DOM_SID *psid, enum SID_NAME_USE *name_type); BOOL lookup_sid(DOM_SID *sid, fstring dom_name, fstring name, enum SID_NAME_USE *name_type); DOM_SID *uid_to_sid(DOM_SID *psid, uid_t uid); DOM_SID *gid_to_sid(DOM_SID *psid, gid_t gid); diff --git a/source3/nsswitch/wb_client.c b/source3/nsswitch/wb_client.c index 77c48352a3..746e5406bc 100644 --- a/source3/nsswitch/wb_client.c +++ b/source3/nsswitch/wb_client.c @@ -27,7 +27,7 @@ /* Call winbindd to convert a name to a sid */ -BOOL winbind_lookup_name(char *name, DOM_SID *sid, enum SID_NAME_USE *name_type) +BOOL winbind_lookup_name(const char *name, DOM_SID *sid, enum SID_NAME_USE *name_type) { struct winbindd_request request; struct winbindd_response response; diff --git a/source3/passdb/passdb.c b/source3/passdb/passdb.c index 2b318eca53..918fdcd088 100644 --- a/source3/passdb/passdb.c +++ b/source3/passdb/passdb.c @@ -504,11 +504,21 @@ BOOL local_lookup_rid(uint32 rid, char *name, enum SID_NAME_USE *psid_name_use) Convert a name into a SID. Used in the lookup name rpc. ********************************************************************/ -BOOL local_lookup_name(char *domain, char *user, DOM_SID *psid, enum SID_NAME_USE *psid_name_use) +BOOL local_lookup_name(const char *c_domain, const char *c_user, DOM_SID *psid, enum SID_NAME_USE *psid_name_use) { extern DOM_SID global_sid_World_Domain; struct passwd *pass = NULL; DOM_SID local_sid; + fstring user; + fstring domain; + + /* + * domain and user may be quoted const strings, and map_username and + * friends can modify them. Make a modifiable copy. JRA. + */ + + fstrcpy(domain, c_domain); + fstrcpy(user, c_user); sid_copy(&local_sid, &global_sam_sid); diff --git a/source3/smbd/uid.c b/source3/smbd/uid.c index 3d37021fff..02522a37a2 100644 --- a/source3/smbd/uid.c +++ b/source3/smbd/uid.c @@ -266,7 +266,7 @@ void unbecome_root(void) Tries winbind first - then uses local lookup. *****************************************************************/ -BOOL lookup_name(char *name, DOM_SID *psid, enum SID_NAME_USE *name_type) +BOOL lookup_name(const char *name, DOM_SID *psid, enum SID_NAME_USE *name_type) { extern pstring global_myname; extern fstring global_myworkgroup; @@ -302,7 +302,6 @@ BOOL lookup_name(char *name, DOM_SID *psid, enum SID_NAME_USE *name_type) ret = local_lookup_name(domain, username, psid, name_type); } else { - ret = local_lookup_name(global_myname, name, psid, name_type); } -- cgit