Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Version checking checks compile time version rather than runtime #135

Open
notnoop opened this issue Oct 30, 2019 · 0 comments
Open

Version checking checks compile time version rather than runtime #135

notnoop opened this issue Oct 30, 2019 · 0 comments
Labels
Bug Confirmed to be a bug

Comments

@notnoop
Copy link

notnoop commented Oct 30, 2019

Many of version checking related functions (e.g.
lxc.VersionNumber, lxc.VersionAtLeast, VERSION_AT_LEAST ` refer to the lxc versions present at compile time in build host rather than the runtime lxc version linked at process start time.

The issue is that they reference preprocessor definition integer constants (e.g. LXC_VERSION_MAJOR , and compiler inlines them with compile time dependency value.

Looks like it was this was addressed partially in #112 .

Reproduction

Run the following scripts below. The script generates a binary that reports lxc versions and is compiled against 2.0. When running it against 3.0.1, I get the following output (the bottom of the script output):

+ echo ======= RUNNING WITH LXC 3.0
+ echo
+ dpkg -l
+ grep lxc
ii  liblxc-common           3.0.4-0ubuntu1              amd64        Linux Containers userspace tools (common tools)
ii  liblxc1                 3.0.4-0ubuntu1              amd64        Linux Containers userspace tools (library)
ii  lxcfs                   3.0.4-2                     amd64        FUSE based filesystem for LXC
+ /tmp/lxc-temp/lxc-version
STRING VERSION:  3.0.4
NUMBER VERSION  2 0
AT LEAST 2.1.0:  false

Script:

#!/bin/bash

set -ex

mkdir -p /tmp/lxc-temp/

# a basic golang app that reports version through different functions
cat <<'EOF' > /tmp/lxc-temp/main.go
package main

import (
"fmt"

lxc "gopkg.in/lxc/go-lxc.v2"
)

func main() {
verStr := lxc.Version()
fmt.Println("STRING VERSION: ", verStr)

major, minor := lxc.VersionNumber()
fmt.Println("NUMBER VERSION ", major, minor)

fmt.Println("AT LEAST 2.1.0: ", lxc.VersionAtLeast(2, 1, 0))
}
EOF

# compile golang binary with LXC 2.0
# uses old ubuntu to lxc 2.0 and old golang 1.10 but results are the same with latest golang 1.13
cat <<'EOF' | docker run -i --rm -v /tmp/lxc-temp:/tmp/lxc-temp ubuntu:16.04 /bin/bash
set -ex
echo this may take a long time
apt-get update >/dev/null

apt-get install -y golang-1.10 build-essential curl git lxc-dev/xenial-updates >/dev/null
ln -s /usr/lib/go-1.10/bin/go /usr/bin/go

mkdir /go
export GOPATH=/go
go get -u -v gopkg.in/lxc/go-lxc.v2
go build -o /tmp/lxc-temp/lxc-version /tmp/lxc-temp/main.go

echo ======= RUNNING WITH LXC 2.0
echo
dpkg -l |grep lxc
/tmp/lxc-temp/lxc-version
EOF

# now run it in latest ubuntu with latest lxc
cat <<'EOF' | docker run -i --rm -v /tmp/lxc-temp:/tmp/lxc-temp ubuntu:19.10 /bin/bash
set -ex
apt-get update >/dev/null
apt-get install -y liblxc1 >/dev/null

echo ======= RUNNING WITH LXC 3.0
echo
dpkg -l |grep lxc
/tmp/lxc-temp/lxc-version
EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Confirmed to be a bug
Development

No branches or pull requests

2 participants