Subject: Re: toolchain/37143: nbmtree dumps core
To: None <gnats-bugs@NetBSD.org, toolchain-manager@NetBSD.org,>
From: John Nemeth <jnemeth@victoria.tc.ca>
List: netbsd-bugs
Date: 10/18/2007 05:30:09
On Feb 2, 1:22pm, yamt@mwd.biglobe.ne.jp wrote:
}
} >Number: 37143
} >Category: toolchain
} >Synopsis: nbmtree dumps core
} >Responsible: toolchain-manager
} >State: open
} >Class: sw-bug
} >Arrival-Date: Thu Oct 18 01:15:01 +0000 2007
} >Originator: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
} >Environment:
} NetBSD 4.99.33 amd64
} >Description:
} it seems that nbmtree is compiled without a proper function
} prototype of user_from_uid. (-Wall yields "implicit decl" warnings)
} it makes the return value truncated to int.
} malloc used to return a pointer to heap, which might be small enough
} to fit in int. after jemalloc, it isn't the case anymore.
} >How-To-Repeat:
} run build.sh on 64bit -current with jemalloc.
The problem is caused by this bit of code in /usr/include/pwd.h:
-----
#if defined(_NETBSD_SOURCE)
int pw_gensalt(char *, size_t, const char *, const char *);
int pw_scan(char *, struct passwd *, int *);
int setpassent(int);
int getpwent_r(struct passwd *, char *, size_t, struct passwd **);
const char *user_from_uid(uid_t, int);
int uid_from_user(const char *, uid_t *);
int pwcache_userdb(int (*)(int), void (*)(void),
struct passwd * (*)(const char *),
struct passwd * (*)(uid_t));
#endif
-----
_NETBSD_SOURCE isn't defined for compat (i.e. tools) building.
However, several of these functions are provided by our compat
library. I propose the following fix:
-----
#if defined(_NETBSD_SOURCE)
int pw_gensalt(char *, size_t, const char *, const char *);
int setpassent(int);
int getpwent_r(struct passwd *, char *, size_t, struct passwd **);
#endif
#if defined(_NETBSD_SOURCE) || defined(HAVE_NBTOOL_CONFIG_H)
int pw_scan(char *, struct passwd *, int *);
const char *user_from_uid(uid_t, int);
int uid_from_user(const char *, uid_t *);
int pwcache_userdb(int (*)(int), void (*)(void),
struct passwd * (*)(const char *),
struct passwd * (*)(uid_t));
#endif
-----
Since I'm not famailiar with how our compat library works, I would like
somebody else to verify that this is correct.
}-- End of excerpt from yamt@mwd.biglobe.ne.jp