~ubuntu-branches/ubuntu/natty/python3.1/natty-security

« back to all changes in this revision

Viewing changes to Python/dynload_shlib.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2010-07-06 16:52:42 UTC
  • mfrom: (1.2.1 upstream) (2.1.11 sid)
  • Revision ID: james.westby@ubuntu.com-20100706165242-2xv4i019r3et6c0j
Tags: 3.1.2+20100706-1ubuntu1
* Merge with Debian; remaining changes:
  - Regenerate the control file.
  - Add debian/patches/overwrite-semaphore-check for Lucid buildds.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
 
34
34
const struct filedescr _PyImport_DynLoadFiletab[] = {
35
35
#ifdef __CYGWIN__
36
 
        {".dll", "rb", C_EXTENSION},
37
 
        {"module.dll", "rb", C_EXTENSION},
 
36
    {".dll", "rb", C_EXTENSION},
 
37
    {"module.dll", "rb", C_EXTENSION},
38
38
#else
39
39
#if defined(PYOS_OS2) && defined(PYCC_GCC)
40
 
        {".pyd", "rb", C_EXTENSION},
41
 
        {".dll", "rb", C_EXTENSION},
 
40
    {".pyd", "rb", C_EXTENSION},
 
41
    {".dll", "rb", C_EXTENSION},
42
42
#else
43
43
#ifdef __VMS
44
 
        {".exe", "rb", C_EXTENSION},
45
 
        {".EXE", "rb", C_EXTENSION},
46
 
        {"module.exe", "rb", C_EXTENSION},
47
 
        {"MODULE.EXE", "rb", C_EXTENSION},
 
44
    {".exe", "rb", C_EXTENSION},
 
45
    {".EXE", "rb", C_EXTENSION},
 
46
    {"module.exe", "rb", C_EXTENSION},
 
47
    {"MODULE.EXE", "rb", C_EXTENSION},
48
48
#else
49
 
        {".so", "rb", C_EXTENSION},
50
 
        {"module.so", "rb", C_EXTENSION},
51
 
#endif
52
 
#endif
53
 
#endif
54
 
        {0, 0}
 
49
    {".so", "rb", C_EXTENSION},
 
50
    {"module.so", "rb", C_EXTENSION},
 
51
#endif
 
52
#endif
 
53
#endif
 
54
    {0, 0}
55
55
};
56
56
 
57
57
static struct {
58
 
        dev_t dev;
 
58
    dev_t dev;
59
59
#ifdef __VMS
60
 
        ino_t ino[3];
 
60
    ino_t ino[3];
61
61
#else
62
 
        ino_t ino;
 
62
    ino_t ino;
63
63
#endif
64
 
        void *handle;
 
64
    void *handle;
65
65
} handles[128];
66
66
static int nhandles = 0;
67
67
 
68
68
 
69
69
dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname,
70
 
                                    const char *pathname, FILE *fp)
 
70
                                    const char *pathname, FILE *fp)
71
71
{
72
 
        dl_funcptr p;
73
 
        void *handle;
74
 
        char funcname[258];
75
 
        char pathbuf[260];
76
 
        int dlopenflags=0;
77
 
 
78
 
        if (strchr(pathname, '/') == NULL) {
79
 
                /* Prefix bare filename with "./" */
80
 
                PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
81
 
                pathname = pathbuf;
82
 
        }
83
 
 
84
 
        PyOS_snprintf(funcname, sizeof(funcname), 
85
 
                      LEAD_UNDERSCORE "PyInit_%.200s", shortname);
86
 
 
87
 
        if (fp != NULL) {
88
 
                int i;
89
 
                struct stat statb;
90
 
                fstat(fileno(fp), &statb);
91
 
                for (i = 0; i < nhandles; i++) {
92
 
                        if (statb.st_dev == handles[i].dev &&
93
 
                            statb.st_ino == handles[i].ino) {
94
 
                                p = (dl_funcptr) dlsym(handles[i].handle,
95
 
                                                       funcname);
96
 
                                return p;
97
 
                        }
98
 
                }
99
 
                if (nhandles < 128) {
100
 
                        handles[nhandles].dev = statb.st_dev;
 
72
    dl_funcptr p;
 
73
    void *handle;
 
74
    char funcname[258];
 
75
    char pathbuf[260];
 
76
    int dlopenflags=0;
 
77
 
 
78
    if (strchr(pathname, '/') == NULL) {
 
79
        /* Prefix bare filename with "./" */
 
80
        PyOS_snprintf(pathbuf, sizeof(pathbuf), "./%-.255s", pathname);
 
81
        pathname = pathbuf;
 
82
    }
 
83
 
 
84
    PyOS_snprintf(funcname, sizeof(funcname),
 
85
                  LEAD_UNDERSCORE "PyInit_%.200s", shortname);
 
86
 
 
87
    if (fp != NULL) {
 
88
        int i;
 
89
        struct stat statb;
 
90
        fstat(fileno(fp), &statb);
 
91
        for (i = 0; i < nhandles; i++) {
 
92
            if (statb.st_dev == handles[i].dev &&
 
93
                statb.st_ino == handles[i].ino) {
 
94
                p = (dl_funcptr) dlsym(handles[i].handle,
 
95
                                       funcname);
 
96
                return p;
 
97
            }
 
98
        }
 
99
        if (nhandles < 128) {
 
100
            handles[nhandles].dev = statb.st_dev;
101
101
#ifdef __VMS
102
 
                        handles[nhandles].ino[0] = statb.st_ino[0];
103
 
                        handles[nhandles].ino[1] = statb.st_ino[1];
104
 
                        handles[nhandles].ino[2] = statb.st_ino[2];
 
102
            handles[nhandles].ino[0] = statb.st_ino[0];
 
103
            handles[nhandles].ino[1] = statb.st_ino[1];
 
104
            handles[nhandles].ino[2] = statb.st_ino[2];
105
105
#else
106
 
                        handles[nhandles].ino = statb.st_ino;
 
106
            handles[nhandles].ino = statb.st_ino;
107
107
#endif
108
 
                }
109
 
        }
 
108
        }
 
109
    }
110
110
 
111
111
#if !(defined(PYOS_OS2) && defined(PYCC_GCC))
112
 
        dlopenflags = PyThreadState_GET()->interp->dlopenflags;
 
112
    dlopenflags = PyThreadState_GET()->interp->dlopenflags;
113
113
#endif
114
114
 
115
 
        if (Py_VerboseFlag)
116
 
                PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname, 
117
 
                                  dlopenflags);
 
115
    if (Py_VerboseFlag)
 
116
        PySys_WriteStderr("dlopen(\"%s\", %x);\n", pathname,
 
117
                          dlopenflags);
118
118
 
119
119
#ifdef __VMS
120
 
        /* VMS currently don't allow a pathname, use a logical name instead */
121
 
        /* Concatenate 'python_module_' and shortname */
122
 
        /* so "import vms.bar" will use the logical python_module_bar */
123
 
        /* As C module use only one name space this is probably not a */
124
 
        /* important limitation */
125
 
        PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s", 
126
 
                      shortname);
127
 
        pathname = pathbuf;
 
120
    /* VMS currently don't allow a pathname, use a logical name instead */
 
121
    /* Concatenate 'python_module_' and shortname */
 
122
    /* so "import vms.bar" will use the logical python_module_bar */
 
123
    /* As C module use only one name space this is probably not a */
 
124
    /* important limitation */
 
125
    PyOS_snprintf(pathbuf, sizeof(pathbuf), "python_module_%-.200s",
 
126
                  shortname);
 
127
    pathname = pathbuf;
128
128
#endif
129
129
 
130
 
        handle = dlopen(pathname, dlopenflags);
 
130
    handle = dlopen(pathname, dlopenflags);
131
131
 
132
 
        if (handle == NULL) {
133
 
                const char *error = dlerror();
134
 
                if (error == NULL)
135
 
                        error = "unknown dlopen() error";
136
 
                PyErr_SetString(PyExc_ImportError, error);
137
 
                return NULL;
138
 
        }
139
 
        if (fp != NULL && nhandles < 128)
140
 
                handles[nhandles++].handle = handle;
141
 
        p = (dl_funcptr) dlsym(handle, funcname);
142
 
        return p;
 
132
    if (handle == NULL) {
 
133
        const char *error = dlerror();
 
134
        if (error == NULL)
 
135
            error = "unknown dlopen() error";
 
136
        PyErr_SetString(PyExc_ImportError, error);
 
137
        return NULL;
 
138
    }
 
139
    if (fp != NULL && nhandles < 128)
 
140
        handles[nhandles++].handle = handle;
 
141
    p = (dl_funcptr) dlsym(handle, funcname);
 
142
    return p;
143
143
}