Annotation of embedaddon/sudo/plugins/sudoers/prompt.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 1993-1996,1998-2005, 2007-2013
3: * Todd C. Miller <Todd.Miller@courtesan.com>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: *
17: * Sponsored in part by the Defense Advanced Research Projects
18: * Agency (DARPA) and Air Force Research Laboratory, Air Force
19: * Materiel Command, USAF, under agreement number F39502-99-1-0512.
20: */
21:
22: #include <config.h>
23:
24: #include <sys/types.h>
25: #include <stdio.h>
26: #ifdef STDC_HEADERS
27: # include <stdlib.h>
28: # include <stddef.h>
29: #else
30: # ifdef HAVE_STDLIB_H
31: # include <stdlib.h>
32: # endif
33: #endif /* STDC_HEADERS */
34: #ifdef HAVE_STRING_H
35: # include <string.h>
36: #endif /* HAVE_STRING_H */
37: #ifdef HAVE_STRINGS_H
38: # include <strings.h>
39: #endif /* HAVE_STRINGS_H */
40: #include <pwd.h>
41: #include <grp.h>
42:
43: #include "sudoers.h"
44:
45: /*
46: * Expand %h and %u escapes in the prompt and pass back the dynamically
47: * allocated result. Returns the same string if there are no escapes.
48: */
49: char *
50: expand_prompt(const char *old_prompt, const char *user, const char *host)
51: {
52: size_t len, n;
53: int subst;
54: const char *p;
55: char *np, *new_prompt, *endp;
56: debug_decl(expand_prompt, SUDO_DEBUG_AUTH)
57:
58: /* How much space do we need to malloc for the prompt? */
59: subst = 0;
60: for (p = old_prompt, len = strlen(old_prompt); *p; p++) {
61: if (p[0] =='%') {
62: switch (p[1]) {
63: case 'h':
64: p++;
65: len += strlen(user_shost) - 2;
66: subst = 1;
67: break;
68: case 'H':
69: p++;
70: len += strlen(user_host) - 2;
71: subst = 1;
72: break;
73: case 'p':
74: p++;
75: if (def_rootpw)
76: len += 2;
77: else if (def_targetpw || def_runaspw)
78: len += strlen(runas_pw->pw_name) - 2;
79: else
80: len += strlen(user_name) - 2;
81: subst = 1;
82: break;
83: case 'u':
84: p++;
85: len += strlen(user_name) - 2;
86: subst = 1;
87: break;
88: case 'U':
89: p++;
90: len += strlen(runas_pw->pw_name) - 2;
91: subst = 1;
92: break;
93: case '%':
94: p++;
95: len--;
96: subst = 1;
97: break;
98: default:
99: break;
100: }
101: }
102: }
103:
104: if (subst) {
105: new_prompt = emalloc(++len);
106: endp = new_prompt + len;
107: for (p = old_prompt, np = new_prompt; *p; p++) {
108: if (p[0] =='%') {
109: switch (p[1]) {
110: case 'h':
111: p++;
112: n = strlcpy(np, user_shost, np - endp);
113: if (n >= np - endp)
114: goto oflow;
115: np += n;
116: continue;
117: case 'H':
118: p++;
119: n = strlcpy(np, user_host, np - endp);
120: if (n >= np - endp)
121: goto oflow;
122: np += n;
123: continue;
124: case 'p':
125: p++;
126: if (def_rootpw)
127: n = strlcpy(np, "root", np - endp);
128: else if (def_targetpw || def_runaspw)
129: n = strlcpy(np, runas_pw->pw_name, np - endp);
130: else
131: n = strlcpy(np, user_name, np - endp);
132: if (n >= np - endp)
133: goto oflow;
134: np += n;
135: continue;
136: case 'u':
137: p++;
138: n = strlcpy(np, user_name, np - endp);
139: if (n >= np - endp)
140: goto oflow;
141: np += n;
142: continue;
143: case 'U':
144: p++;
145: n = strlcpy(np, runas_pw->pw_name, np - endp);
146: if (n >= np - endp)
147: goto oflow;
148: np += n;
149: continue;
150: case '%':
151: /* convert %% -> % */
152: p++;
153: break;
154: default:
155: /* no conversion */
156: break;
157: }
158: }
159: *np++ = *p;
160: if (np >= endp)
161: goto oflow;
162: }
163: *np = '\0';
164: } else
165: new_prompt = estrdup(old_prompt);
166:
167: debug_return_str(new_prompt);
168:
169: oflow:
170: /* We pre-allocate enough space, so this should never happen. */
171: fatalx(_("internal error, %s overflow"), "expand_prompt()");
172: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>