Skip to content

Opening broken symlink with O_CREAT returns EEXIST unlike linux #23001

Closed
@hoodmane

Description

@hoodmane

The source code:

#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>


char* join_path(const char* path1, const char* path2) {
    int len1 = strlen(path1);
    int len2 = strlen(path2);
    char* result = malloc(len1 + len2 + 2);
    memcpy(result, path1, len1);
    result[len1] = '/';
    memcpy(result + len1 + 1, path2, len2);
    return result;
}

int main() {
    char template[] = "/tmp/tmpdir.XXXXXX";
    char *tmpdir = mkdtemp(template);
    char* p1 = join_path(tmpdir, "test");
    char* p2 = join_path(tmpdir, "test2");

    int res = symlink(p2, p1);
    printf("link result: %d\n", res);
    res = open(p1, O_CREAT);
    printf("open result: %d, errno: %d %s\n", res, errno, strerror(errno));
    free(p1);
    free(p2);
}

Run it:

$ gcc broken_symlink.c && ./a.out
link result: 0
open result: 3, errno: 0 Success
$ emcc broken_symlink.c && node a.out.js 
link result: 0
open result: -1, errno: 20 File exists

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions