On Sat, Jul 07, 2012 at 08:14:10PM +0200, Noël Köthe wrote:
> Am Dienstag, den 03.07.2012, 13:26 +0400 schrieb Alexander V. Lukyanov:
>
> > >    for example,  if I have PC A, B with the same master.passwd.
> > >    They all have one line:
> > >    9100075:*:3018:1001::0:0:REALNAME:/home/9100075:/usr/local/bin/bash
> > >    => username = 9100075,  uid = 3018.    and uid=9100075 doesn't exist.
> >
> > I think it is forbidden to have a user name starting with a digit.
> > pwck should warn about it.
>
> afaik this limitation isn't true anymore:

Please try this patch.

--
   Alexander.
diff --git a/src/IdNameCache.cc b/src/IdNameCache.cc
index 8e71060..ccc31be 100644
--- a/src/IdNameCache.cc
+++ b/src/IdNameCache.cc
@@ -67,8 +67,6 @@ IdNamePair *IdNameCache::lookup(int id)
 }
 IdNamePair *IdNameCache::lookup(const char *name)
 {
-   if(isdigit((unsigned char)*name))
-      return lookup(atoi(name));
    unsigned h=hash(name);
    for(IdNamePair *scan=table_id[h]; scan; scan=scan->next)
       if(!xstrcmp(name,scan->name))
@@ -92,8 +90,6 @@ const char *IdNameCache::Lookup(int id)
 }
 int IdNameCache::Lookup(const char *name)
 {
-   if(isdigit((unsigned char)*name))
-      return atoi(name);
    return lookup(name)->id;
 }
 IdNameCache::IdNameCache()
@@ -137,19 +133,27 @@ IdNamePair *GroupCache::get_record(int id)
       return 0;
    return new IdNamePair(p->gr_gid,p->gr_name);
 }
+
+IdNamePair *IdNameCache::get_record(const char *name)
+{
+   int id,n;
+   if(sscanf(name,"%d%n",&id,&n)==1 && !name[n])
+      return new IdNamePair(id,name);
+   return 0;
+}
 IdNamePair *PasswdCache::get_record(const char *name)
 {
    struct passwd *p=getpwnam(name);
-   if(!p)
-      return 0;
-   return new IdNamePair(p->pw_uid,name);
+   if(p)
+      return new IdNamePair(p->pw_uid,name);
+   return IdNameCache::get_record(name);
 }
 IdNamePair *GroupCache::get_record(const char *name)
 {
    struct group *p=getgrnam(name);
-   if(!p)
-      return 0;
-   return new IdNamePair(p->gr_gid,name);
+   if(p)
+      return new IdNamePair(p->gr_gid,name);
+   return IdNameCache::get_record(name);
 }
 
 PasswdCache *PasswdCache::instance;
diff --git a/src/IdNameCache.h b/src/IdNameCache.h
index 82b478e..9e655cc 100644
--- a/src/IdNameCache.h
+++ b/src/IdNameCache.h
@@ -53,7 +53,7 @@ class IdNameCache : public SMTask
 
 protected:
    virtual IdNamePair *get_record(int id)=0;
-   virtual IdNamePair *get_record(const char *name)=0;
+   virtual IdNamePair *get_record(const char *name);
 
    IdNamePair *lookup(int id);
    IdNamePair *lookup(const char *id);
_______________________________________________
lftp mailing list
lftp@uniyar.ac.ru
http://univ.uniyar.ac.ru/mailman/listinfo/lftp

Reply via email to