OpenBSD manual page server

Manual Page Search Parameters

I386_GET_LDT(2) System Calls Manual (i386) I386_GET_LDT(2)

i386_get_ldt, i386_set_ldtmanage i386 per-process Local Descriptor Table entries

#include <sys/types.h>
#include <machine/segments.h>
#include <machine/sysarch.h>

int
i386_get_ldt(int start_sel, union descriptor *descs, int num_sels);

int
i386_set_ldt(int start_sel, union descriptor *descs, int num_sels);

() returns a list of the i386 descriptors in the current process' LDT. () sets a list of i386 descriptors in the current process' LDT. For both routines, start_sel specifies the index of the selector in the LDT at which to begin and descs points to an array of num_sels descriptors to be set or returned.

Each entry in the descs array can be either a segment_descriptor or a gate_descriptor, as defined in ⟨i386/segments.h⟩. These structures are defined by the architecture as disjoint bit-fields, so care must be taken in constructing them.

Before this API can be used the functionality has to be enabled using the machdep.userldt sysctl(8) variable.

Code using the () and () functions must be compiled using -li386.

Upon successful completion, i386_get_ldt() returns the number of i386 descriptors copied into descs from the current process' LDT. Otherwise, a value of -1 is returned and the global variable errno is set to indicate the error.

Upon successful completion, i386_set_ldt() returns the first selector set; if the kernel allocated a descriptor in the LDT, the allocated index is returned. Otherwise, a value of -1 is returned and the global variable errno is set to indicate the error.

i386_get_ldt() and i386_set_ldt() will fail if:

[]
An inappropriate parameter was used for start_sel or num_sels.
[]
The caller attempted to use a descriptor that would circumvent protection or cause a failure.

Intel, i386 Microprocessor Programmer's Reference Manual.

You can really hose your process using this.

May 31, 2007 OpenBSD-5.5