Coverage Report

Created: 2026-10-13 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssh/openbsd-compat/pwcache.c
Line
Count
Source
1
/*  $OpenBSD: pwcache.c,v 1.9 2005/08/08 08:05:34 espie Exp $ */
2
/*
3
 * Copyright (c) 1989, 1993
4
 *  The Regents of the University of California.  All rights reserved.
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
8
 * are met:
9
 * 1. Redistributions of source code must retain the above copyright
10
 *    notice, this list of conditions and the following disclaimer.
11
 * 2. Redistributions in binary form must reproduce the above copyright
12
 *    notice, this list of conditions and the following disclaimer in the
13
 *    documentation and/or other materials provided with the distribution.
14
 * 3. Neither the name of the University nor the names of its contributors
15
 *    may be used to endorse or promote products derived from this software
16
 *    without specific prior written permission.
17
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28
 * SUCH DAMAGE.
29
 */
30
31
/* OPENBSD ORIGINAL: lib/libc/gen/pwcache.c */
32
33
#include "includes.h"
34
35
#include <sys/types.h>
36
37
#include <grp.h>
38
#include <pwd.h>
39
#include <stdio.h>
40
#include <stdlib.h>
41
#include <string.h>
42
43
0
#define NCACHE  64      /* power of 2 */
44
0
#define MASK  (NCACHE - 1)    /* bits to store with */
45
46
#ifndef HAVE_USER_FROM_UID
47
char *
48
user_from_uid(uid_t uid, int nouser)
49
0
{
50
0
  static struct ncache {
51
0
    uid_t uid;
52
0
    char  *name;
53
0
  } c_uid[NCACHE];
54
0
  static int pwopen;
55
0
  static char nbuf[15];   /* 32 bits == 10 digits */
56
0
  struct passwd *pw;
57
0
  struct ncache *cp;
58
59
0
  cp = c_uid + (uid & MASK);
60
0
  if (cp->uid != uid || cp->name == NULL) {
61
0
    if (pwopen == 0) {
62
#ifdef HAVE_SETPASSENT
63
      setpassent(1);
64
#endif
65
0
      pwopen = 1;
66
0
    }
67
0
    if ((pw = getpwuid(uid)) == NULL) {
68
0
      if (nouser)
69
0
        return (NULL);
70
0
      (void)snprintf(nbuf, sizeof(nbuf), "%lu", (u_long)uid);
71
0
    }
72
0
    cp->uid = uid;
73
0
    if (cp->name != NULL)
74
0
      free(cp->name);
75
0
    cp->name = strdup(pw ? pw->pw_name : nbuf);
76
0
  }
77
0
  return (cp->name);
78
0
}
79
#endif
80
81
#ifndef HAVE_GROUP_FROM_GID
82
char *
83
group_from_gid(gid_t gid, int nogroup)
84
0
{
85
0
  static struct ncache {
86
0
    gid_t gid;
87
0
    char  *name;
88
0
  } c_gid[NCACHE];
89
0
  static int gropen;
90
0
  static char nbuf[15];   /* 32 bits == 10 digits */
91
0
  struct group *gr;
92
0
  struct ncache *cp;
93
94
0
  cp = c_gid + (gid & MASK);
95
0
  if (cp->gid != gid || cp->name == NULL) {
96
0
    if (gropen == 0) {
97
#ifdef HAVE_SETGROUPENT
98
      setgroupent(1);
99
#endif
100
0
      gropen = 1;
101
0
    }
102
0
    if ((gr = getgrgid(gid)) == NULL) {
103
0
      if (nogroup)
104
0
        return (NULL);
105
0
      (void)snprintf(nbuf, sizeof(nbuf), "%lu", (u_long)gid);
106
0
    }
107
0
    cp->gid = gid;
108
0
    if (cp->name != NULL)
109
0
      free(cp->name);
110
0
    cp->name = strdup(gr ? gr->gr_name : nbuf);
111
0
  }
112
0
  return (cp->name);
113
0
}
114
#endif