static int dochangepwd1(const char *service, const char *uid, const char *opwd, const char *npwd, int hmac_flag) { char *udbs; char *services; char *passwords; int rc; char *u; struct userdbs *udb; udbs=userdbshadow(USERDB "shadow.dat", uid); if (!udbs) { errno=EINVAL; return (1); } if ((services=malloc(strlen(service)+sizeof("pw"))) == 0) { perror("malloc"); free(udbs); errno=EPERM; return (1); } strcat(strcpy(services, service), "pw"); passwords=userdb_gets(udbs, services); free(services); if (passwords == 0) { passwords=userdb_gets(udbs, "systempw"); service="system"; } if (!passwords || (hmac_flag ? strcmp(opwd, passwords): authcheckpassword(opwd, passwords))) { if (passwords) free(passwords); free(udbs); errno=EPERM; return (1); } free(passwords); free(udbs); userdb_init(USERDB ".dat"); if ( (u=userdb(uid)) == 0 || (udb=userdb_creates(u)) == 0) { if (u) free(u); errno=EPERM; return (1); } rc=dochangepwd2(service, uid, u, udb, npwd); userdb_frees(udb); free(u); return (rc); }
static int dochangepwd1(const char *service, const char *uid, const char *opwd, const char *npwd, const char *hmac_flag) { char *udbs; char *services; char *passwords; int rc; char *u; struct userdbs *udb; udbs=userdbshadow(USERDB "shadow.dat", uid); if (!udbs) { errno=ENOENT; return (-1); } if ((services=malloc(strlen(service)+sizeof("pw"))) == 0) { perror("malloc"); free(udbs); errno=EPERM; return (1); } strcat(strcpy(services, service), "pw"); DPRINTF("Checking for password called \"%s\"", services); passwords=userdb_gets(udbs, services); free(services); if (passwords == 0 && hmac_flag == 0) { DPRINTF("Not found, checking for \"systempw\""); passwords=userdb_gets(udbs, "systempw"); service="system"; } if (!passwords || (hmac_flag ? strcmp(opwd, passwords): authcheckpassword(opwd, passwords))) { if (!passwords) { DPRINTF("Password not found."); } else { DPRINTF("Password didn't match."); } if (passwords) free(passwords); free(udbs); errno=EPERM; return (-1); } free(passwords); free(udbs); userdb_init(USERDB ".dat"); if ( (u=userdb(uid)) == 0 || (udb=userdb_creates(u)) == 0) { if (u) free(u); errno=EPERM; return (1); } rc=dochangepwd2(service, uid, u, udb, npwd); userdb_frees(udb); free(u); return (rc); }