OVH Cloud OVH Cloud

portabilité

15 réponses
Avatar
manu
Deux petites questions de portabilité:

1) pour me debarasser desdroits de root, j'ai l'habitude d'ecrire

if ((setuid(something) != 0) ||
(seteuid(something) != 0))
perror("...

Ca compile bien sur BSD, moins bien sur d'autres systèmes. Quelle est la
façon portable de faire ca?

2) De même, pour tester si un objet est un socket Unix, j'utilie stat(2)
et je teste le bit S_IFSOCK du champ st_mode. Ca râle sous Linux.
Comment doit on faire?

--
Emmanuel Dreyfus
Publicité subliminale: achetez ce livre!
http://www.eyrolles.com/php.informatique/Ouvrages/9782212112443.php3
manu@netbsd.org

10 réponses

1 2
Avatar
I love cats
(Emmanuel Dreyfus) writes:

Deux petites questions de portabilité:

1) pour me debarasser desdroits de root, j'ai l'habitude d'ecrire

if ((setuid(something) != 0) ||
(seteuid(something) != 0))
perror("...

Ca compile bien sur BSD, moins bien sur d'autres systèmes. Quelle est la
façon portable de faire ca?


Quel est le problème exactement ?

2) De même, pour tester si un objet est un socket Unix, j'utilie stat(2)
et je teste le bit S_IFSOCK du champ st_mode. Ca râle sous Linux.
Comment doit on faire?


Utiliser la macro S_ISSOCK ? Comme ceci
if (S_ISSOCK(st.st_mode))

--
"Never ascribe to malice what can be explained by human stupidity"
R. A. Heinlein

Avatar
manu
I love cats wrote:

if ((setuid(something) != 0) ||
(seteuid(something) != 0))
perror("...

Ca compile bien sur BSD, moins bien sur d'autres systèmes. Quelle est la
façon portable de faire ca?
Quel est le problème exactement ?



Passer sous un UID non root dans un daemon.

2) De même, pour tester si un objet est un socket Unix, j'utilie stat(2)
et je teste le bit S_IFSOCK du champ st_mode. Ca râle sous Linux.
Comment doit on faire?
Utiliser la macro S_ISSOCK ? Comme ceci

if (S_ISSOCK(st.st_mode))


Pour Linux, elle est dans un ifdef __USE_BSD dans les headers. J'ai beau
definir ce symbole, ca ne passe pas pour autant. Quelle est l'astuce?

--
Emmanuel Dreyfus
Publicité subliminale: achetez ce livre!
http://www.eyrolles.com/Informatique/Livre/9782212112443/Livre_BSD.php



Avatar
Laurent Wacrenier
Emmanuel Dreyfus écrit:
1) pour me debarasser desdroits de root, j'ai l'habitude d'ecrire

if ((setuid(something) != 0) ||
(seteuid(something) != 0))
perror("...


setuid() change les utilisateurs reéls, effectifs et sauvegardés.

Ca compile bien sur BSD, moins bien sur d'autres systèmes. Quelle est la
façon portable de faire ca?


Quelle est l'erreur ?
Certains systèmes n'ont pas seteuid(), bien que ce soit une fonction
POSIX (ils utilisent setreuid() ou setresuid()).
setuid() fait tout, de toute manière.

Avatar
Antoine Bellot
Emmanuel Dreyfus a écrit:
Deux petites questions de portabilité:

1) pour me debarasser desdroits de root, j'ai l'habitude d'ecrire

if ((setuid(something) != 0) ||
(seteuid(something) != 0))
perror("...

Ca compile bien sur BSD, moins bien sur d'autres systèmes. Quelle est la
façon portable de faire ca?


à l'exception de la feature POSIX de facto optionnelle _POSIX_SAVED_IDS,
il n'existe pas à ma connaissance de manière POSIX de se débarasser
temporairement des droits de root (dans l'espoir de les recouvrer par la
suite par des ressources internes au processus).

--
Antoine Bellot :
#ifndef __M68K_SPINLOCK_H
#define __M68K_SPINLOCK_H
#error "m68k doesn't do SMP yet"
-- SCO's IP


It's not an exact reference, due to the fact that the API changes
from version to version, and that the kernel API is not required
to match the documentation. -- Jamie Lokier abt LDD-3

Avatar
Thomas Nemeth
Le mar 02 mar 2004 à 13:02, Antoine Bellot a tapoté :
| Emmanuel Dreyfus a écrit:
| >
| > if ((setuid(something) != 0) ||
| > (seteuid(something) != 0))
| > perror("...
| >
| > Ca compile bien sur BSD, moins bien sur d'autres systèmes. Quelle est la
| > façon portable de faire ca?
|
| à l'exception de la feature POSIX de facto optionnelle _POSIX_SAVED_IDS,
| il n'existe pas à ma connaissance de manière POSIX de se débarasser
| temporairement des droits de root (dans l'espoir de les recouvrer par la
| suite par des ressources internes au processus).

Mais il n'a peut-être pas l'intention de les recouvrer par la suite,
d'autant que c'est pour faire un daemon...


Thomas
--
TP: Ne doit-on pas dire fora plutôt que forums ??
JB: C'est sûr ; d'ailleurs on dit bien "un hortensium" et "des gérania"
-+- in: Guide du Cabaliste Usenet - Du renommationnage -+-
Avatar
manu
Thomas Nemeth wrote:

Mais il n'a peut-être pas l'intention de les recouvrer par la suite,
d'autant que c'est pour faire un daemon...


Tout à fait, je ne souhaite pas les recuperer.
En faisant #define _BSD_SOURCE, ca compile sous linux en -Wall -Werror.
Mais ca n'est pas très satisfaisant.

--
Emmanuel Dreyfus
Publicité subliminale: achetez ce livre!
http://www.eyrolles.com/Informatique/Livre/9782212112443/Livre_BSD.php


Avatar
Thomas Nemeth
Le mar 02 mar 2004 à 15:51, Emmanuel Dreyfus a tapoté :
| Thomas Nemeth wrote:
|
| > Mais il n'a peut-être pas l'intention de les recouvrer par la suite,
| > d'autant que c'est pour faire un daemon...
|
| Tout à fait, je ne souhaite pas les recuperer.
| En faisant #define _BSD_SOURCE, ca compile sous linux en -Wall -Werror.
| Mais ca n'est pas très satisfaisant.

C'est con quand même car c'est POSIX (cf la page man de stat). Ça ne
devrait pas faire de message d'erreur :(
Je suis déçu.


Thomas
--
BOFH excuse #21:
POSIX complience problem.
Avatar
Laurent Wacrenier
Emmanuel Dreyfus écrit:
En faisant #define _BSD_SOURCE, ca compile sous linux en -Wall -Werror.
Mais ca n'est pas très satisfaisant.


Ha, les joies de la glibc...

Avatar
Antoine Bellot
Emmanuel Dreyfus a écrit:

Tout à fait, je ne souhaite pas les recuperer.
En faisant #define _BSD_SOURCE, ca compile sous linux en -Wall -Werror.
Mais ca n'est pas très satisfaisant.


Disons après ça que ça dépend de ce qu'on entend par portable. Au pire,
setuid en erreur peut fixer errno à EPERM, EAGAIN (dépassement de nproc
rlimit) ou EINVAL dans des cas tordus (SVr4-strict, ou feature
WITH_IRIX_AUDIT). Utiliser setXuid (libc & kernel-dependant) pour un
programme à grande diffusion incite à la prudence.

Par ailleurs, comme le souligne lwa (en termes plus concis, mais très
justes :-))) ), le comportement de set(e)uid n'est pas le même en
libc4/5/glibc2.0 ou en glibc2.1+. Le manuel conseille par principe de
tester _POSIX_SAVED_IDS.

Sans doute la manière de faire de openssh-portable (ssh.c/uidswap.c) est
la plus complexe/aboutie imaginable.

Avatar
I love cats
(Emmanuel Dreyfus) writes:

Passer sous un UID non root dans un daemon.


Ca c'est l'objectif, mais quel est le problème ? Ca marche pas ? Ca
passe pas à la compile ? Au link ? Sur quel système ?

Pour Linux, elle est dans un ifdef __USE_BSD dans les headers. J'ai beau
definir ce symbole, ca ne passe pas pour autant. Quelle est l'astuce?


Ben sans astuce particulière, j'ai fait un petit programme de test et
ça marche chez moi.
compilo: gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)
glibc:
Name : glibc-devel Relocations: (not relocateable)
Version : 2.3.2 Vendor: Red Hat, Inc.
Release : 4.80.8 Build Date: Wed 05 Nov 2003 09:57:31 PM CET

--
"Never ascribe to malice what can be explained by human stupidity"
R. A. Heinlein

1 2